Docker - 从一个链接容器向另一个容器发出命令

时间:2016-01-08 22:51:09

标签: jenkins docker continuous-integration docker-compose continuous-delivery

我正在尝试使用2个Docker容器设置原始CI / CD管道 - 我将其称为 jenkins node-app 。我的目标是让 jenkins 容器在提交到GitHub仓库时运行一个作业(已经完成)。该作业应在 node-app 容器上运行$emailverification = 1; // added // start verify loop foreach($_POST["email"] as $key => $email) { // Filter var email to comfirm it is an email $email = filter_var($email, FILTER_SANITIZE_EMAIL); if (filter_var($email, FILTER_VALIDATE_EMAIL) !== false) { $emailcheckarray[] = 1; } else { $emailcheckarray[] = 0; $emailverification = 0; // added } // Create a string for later $emailfields .= $email .","; } 脚本。因此,当开发人员提交GitHub时, jenkins 会选择提交,然后启动包括自动化测试在内的工作(将来),然后在 node-app 上进行部署

jenkins 容器正在使用最新图片(Dockerfile)

node-app 容器的Dockerfile是:

deploy.sh
使用Docker Compose链接

jenkins node-app ,并且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"] 文件包含(更新,感谢@alkis):

docker-compose.yml

使用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得出(更新):

docker ps

我可以从 node-app ping jenkins ,反之亦然。

这甚至可能吗?如果没有,我在这里犯了一个架构错误吗?

非常感谢你,我很感激!

编辑: 我偶然发现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 并使用thisthis轻松输入容器的shell。但是,这两个都假设原点(在他们的情况下是主机,在我的情况下是 jenkins 容器)安装了Docker以便找到目标容器的PID。我可以从主持人nsenter进入 node-app ,但 jenkins 仍然没有运气。

1 个答案:

答案 0 :(得分:0)

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指定容器名称,这样您就可以使用常量进行通信。

<强>更新

为了测试,请登录jenkins容器的bash终端

docker exec -it my-jenkins bash

然后尝试ping my-node-app,甚至telnet以获取特定端口。

ping my-node-app:80

或者你可以

telnet my-node-app 80

<强>更新

exec command可以轻松完成您想要做的事情。 从您的主机,您可以执行此操作(尝试它,以确保它正在工作)

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

如果上述方法有效,则您的问题委托从容器执行相同的命令。因为它不能这样做,因为发出命令的容器(jenkins)无法访问主机的docker安装(它不仅识别命令,而且保存对您需要访问的容器的控制权)。

我没有使用其中任何一个,但我知道两个解决方案

  1. 使用此官方guide可以访问您的主机的docker守护程序,并从您的容器发出docker命令,就像您从主机上执行此操作一样。
  2. 将docker二进制文件和套接字安装到容器中,因此容器就像它是主机一样(每个命令都将由主机的docker守护程序执行,因为它是共享的。)
  3. 来自SO的thread提供了有关此问题的更多信息。