如何使用Docker Compose从另一个容器使用命令?
我有两个DockerFile:一个用于adonis(具有节点docker的中心映像),另一个用于mongo(具有mongodocker的中心映像) mongo_服务必须依赖于adonis服务,因为我只想在启动所有mongo实例后运行adonis 因此,在mongo dockerfile的末尾,我运行了一个脚本,该脚本最终将运行:如何使用Docker Compose从另一个容器使用命令?,docker,docker-compose,dockerfile,adonis.js,Docker,Docker Compose,Dockerfile,Adonis.js,我有两个DockerFile:一个用于adonis(具有节点docker的中心映像),另一个用于mongo(具有mongodocker的中心映像) mongo_服务必须依赖于adonis服务,因为我只想在启动所有mongo实例后运行adonis 因此,在mongo dockerfile的末尾,我运行了一个脚本,该脚本最终将运行: adonis seed adonis serve 我遇到的错误是:未找到adonis:command 我知道mongo_服务无法访问安装了adonis的adonis_
adonis seed
adonis serve
我遇到的错误是:未找到adonis:command
我知道mongo_服务无法访问安装了adonis的adonis_服务
我的问题是如何访问我安装在另一个容器中的东西?我这样做是为了使工作更有条理
version: '3'
services:
mongo_service:
build:
context: .
dockerfile: docker_mongo_context/Dockerfile
tty: true
hostname: mongo
ports:
- "27017:27017"
depends_on:
- adonis_service
adonis_service:
build:
context: .
dockerfile: docker_adonis_context/Dockerfile
tty: true
hostname: adonis
ports:
- "3333:3333"
volumes:
- .:/app
对于那些对如何使用
ssh
感兴趣的人,我添加了一个小示例,它允许在容器之间使用ssh
,而无需
- 处理用于身份验证的密码
- 向外部环境或主机公开私钥/公钥
- 从外部访问(只有同一docker网络中的docker容器可以访问)
描述
docker compose.yml
docker编写
文件。它由一些配置组成
sshdata
),用于在容器之间共享ssh密钥(用于身份验证)版本:“3.8”
服务:
第一次服务:
建造:
上下文:。
dockerfile:dockerfile-1
网络:
vpcbr:
ipv4_地址:10.5.0.2
环境:
-二次维修=10.5.0.3
卷数:
-sshdata:/home/developer/.ssh/
第二项服务:
建造:
上下文:。
dockerfile:dockerfile-2
网络:
vpcbr:
ipv4_地址:10.5.0.3
卷数:
-sshdata:/home/developer/.ssh/
取决于:
-第一次服务
网络:
vpcbr:
司机:驾驶台
ipam:
配置:
-子网:10.5.0.0/16
卷数:
sshdata:
码头文件
服务的DockerFile是相同的,只有entrypoint.sh
-脚本不同(见下文)
入口点脚本
现在我们来看重要的东西:entrypoint.sh
-脚本,它执行所需的设置步骤。我们的第一个容器(first service
)应该能够ssh
到我们的第二个容器(second service
)
为此,我们的首次服务没有特殊设置。我们只需将~/.ssh
文件夹的所有者更改为对~/.ssh/known_hosts
具有写入权限(但如果不想执行此操作,可以禁用严格的主机密钥检查)
#/bin/bash
#服务第一服务的入口点
#我们现在可以ssh到另一个容器
#更改.ssh文件夹的所有者及其内容
sudochown-R开发者:开发者~/.ssh
#执行你的命令
虽然ssh keyscan-H${SECOND\u SERVICE}>>~/.ssh/known\u主机
做
echo“主机未启动,请重试…”
睡眠1;
完成
# -------------------------------------
#在这里,我们可以运行我们的命令
ssh开发者@${SECOND_SERVICE}“ls-l/”
回声“完成!”
# -------------------------------------
#在这里你可以做其他事情
tail-f/dev/null
一条引人注目的线路是while循环:我们不知道第二个服务何时准备好ssh连接。我们可以等,但那不是很优雅。相反,我们会定期尝试连接到第二个容器,直到命令成功。之后,它将继续执行实际命令
最后是第二个服务的entrypoint.sh
-脚本:
#/bin/bash
#第二次服务的入口点
##--ssh的一点设置
#启动服务器
sudo服务ssh启动
#生成密钥
sudo ssh keygen-t rsa-f/home/developer/.ssh/id\u rsa
#更改.ssh文件夹的所有者及其内容
sudochown-R开发者:开发者~/.ssh
#添加键
sudo echo$(cat/home/developer/.ssh/id\u rsa.pub)>~/.ssh/authorized\u密钥
# -------------------------------------
#我们可以开始做这些事情了
tail-f/dev/null
也许这对某人有帮助。我现在能想到的唯一方法是
ssh
到另一个容器中执行命令。这对您有用吗?我可以问一下如何启动您的容器吗?通常docker compose会在compose文件中为图像创建一个默认网络。是的@agentsmith,这可能会解决您的问题吗?
FROM ubuntu:latest
# We need some tools
RUN apt-get update && apt-get install -y ssh sudo net-tools
# We want to have another user than `root`
RUN adduser developer
## USER SETUP
# We want to have passwordless sudo access
RUN \
sed -i /etc/sudoers -re 's/^%sudo.*/%sudo ALL=(ALL:ALL) NOPASSWD: ALL/g' && \
sed -i /etc/sudoers -re 's/^root.*/root ALL=(ALL:ALL) NOPASSWD: ALL/g' && \
sed -i /etc/sudoers -re 's/^#includedir.*/## **Removed the include directive** ##"/g' && \
echo "developer ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers; su - developer -c id
# Run now with user developer
USER developer
ADD ./entrypoint-1.sh /entrypoint-1.sh
RUN sudo chmod +x /entrypoint-1.sh
ENTRYPOINT [ "/entrypoint-1.sh" ]