Docker – 从一个链接容器发出命令到另一个

我正在尝试使用2个Docker容器来设置一个原始的CI / CDpipe道,我将它们称为jenkinsnode-app 。 我的目标是让jenkins容器在提交到GitHub 仓库时运行一个工作(完成了)。 该工作应该在node-app容器上运行deploy.sh脚本。 因此,当一个开发人员向GitHub提交时, jenkins接受提交,然后开始工作,包括自动化testing(将来),然后在node-app上进行部署。

jenkins容器正在使用最新的图像( Dockerfile) 。

节点应用程序容器的Dockerfile是:

 FROM node:latest EXPOSE 80 WORKDIR /usr/src/final-exercise ADD . /usr/src/final-exercise RUN apt-get update -y RUN apt-get install -y nodejs npm RUN cd /src/final-exercise; npm install CMD ["node", "/usr/src/final-exercise/app.js"] 

jenkinsnode-app使用Docker Compose链接,并且docker-compose.yml文件包含(更新,感谢@alkis):

 node-app: container_name: node-app build: . ports: - 80:80 links: - jenkins jenkins: container_name: jenkins image: jenkins ports: - 8080:8080 volumes: - /home/ec2-user/final-exercise:/var/jenkins 

容器是使用docker-compose up -d构build的docker-compose up -d并按照预期启动。 docker ps产量(更新):

 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 69e52b216d48 finalexercise_node-app "node /usr/src/final-" 3 hours ago Up 3 hours 0.0.0.0:80->80/tcp node-app 5f7e779e5fbd jenkins "/bin/tini -- /usr/lo" 3 hours ago Up 3 hours 0.0.0.0:8080->8080/tcp, 50000/tcp jenkins 

我可以从节点应用程序 ping jenkins ,反之亦然。

这甚至有可能吗? 如果不是,我在这里犯了一个build筑错误吗?

非常感谢你提前,我很感激!

编辑:我偶然发现了nsenter并使用这个和这个容易地进入一个容器的壳。 然而,这些都假设源(在他们的情况下,主机,在我的情况下jenkins容器)安装了Docker,以便find目标容器的PID。 我可以从主机节点应用程序 ,但jenkins仍然没有运气。

 node-app: build: . ports: - 80:80 links: - finalexercise_jenkins_1 jenkins: image: jenkins ports: - 8080:8080 volumes: - /home/ec2-user/final-exercise:/var/jenkins 

尝试以上。 您正在通过图像名称进行链接,但是您必须使用容器名称。 在你的情况下,因为你没有明确指定容器名称,所以会自动生成

 finalexercise : folder where your docker-compose.yml is located node-app : container configs tag 1 : you only have one container with the prefix finalexercise_node-app. If you built a second one, then its name will be finalexercise_node-app_2 

yml文件的设置:

 node-app: build: . container_name: my-node-app ports: - 80:80 links: - my-jenkins jenkins: image: jenkins container_name: my-jenkins ports: - 8080:8080 volumes: - /home/ec2-user/final-exercise:/var/jenkins 

当然,你也可以为node-app指定一个容器名称,这样你就可以使用一些常量来进行通信。

更新

为了testing,请loginjenkins容器的bashterminal

 docker exec -it my-jenkins bash 

然后尝试ping我的节点应用程序,甚至telnet特定的端口。

 ping my-node-app:80 

或者你可以

 telnet my-node-app 80 

更新

你想要做的事情很容易通过exec 命令来完成。 从你的主机,你可以执行这个(尝试它,所以你确定它的工作)

 docker exec -i <container_name> ./deploy.sh 

如果上述工作,那么你的问题委托从一个容器执行相同的命令。 因为你不能这样做,因为发出命令的容器(jenkins)不能访问你的主机的docker安装(它不仅可以识别命令,而且可以控制你需要访问的容器)。

我没有使用过他们,但我知道两种解决scheme

  1. 使用这个官方指南来访问你的主机的docker守护进程,并从你的容器中发出docker命令,就好像你正在从你的主机那里执行一样。
  2. 将docker二进制文件和套接字挂载到容器中,这样容器的行为就好像它是主机(每个命令将由您的主机的docker守护进程执行,因为它是共享的)。

来自SO的这个线索给了这个问题更多的了解。