Docker – 从一个链接容器发出命令到另一个
我正在尝试使用2个Docker容器来设置一个原始的CI / CDpipe道,我将它们称为jenkins和node-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"]
jenkins和node-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
- 使用这个官方指南来访问你的主机的docker守护进程,并从你的容器中发出docker命令,就好像你正在从你的主机那里执行一样。
- 将docker二进制文件和套接字挂载到容器中,这样容器的行为就好像它是主机(每个命令将由您的主机的docker守护进程执行,因为它是共享的)。
来自SO的这个线索给了这个问题更多的了解。
- 如何在CI脚本作业之前重builddock上的docker映像
- Javadocker文件。 build立和testing或只是运行jar文件?
- 我如何运行Docker Swarm的集成testing?
- Azure应用服务+ Docker自动部署?
- 使用bitbucketpipe道进行dropwizard + mysql + maven + docker项目的持续集成/交付
- 如何在数据库的DEV,QA,PROD环境中部署数据库的连续变化?
- GitLab CIpipe道与多容器kubernetes吊舱
- 如何运行无头selenium脚本,独立于主机和浏览器
- 如何获得和呈现在JavaScript页面内的docker状态?