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

Docker - issue command from one linked container to another

我正在尝试使用 2 个 Docker 容器设置原始 CI/CD 管道——我将它们称为 jenkins节点应用。我的目标是让 jenkins 容器在提交到 GitHub 存储库后 运行 完成一项工作(完成)。该作业应该 运行 在 node-app 容器上的 deploy.sh 脚本。因此,当开发人员提交 GitHub 时,jenkins 获取提交,然后开始一项工作,包括自动化测试(将来),然后在 上进行部署=]node-app.

jenkins 容器正在使用最新的镜像 (Dockerfile).

node-app 容器的 Docker 文件是:

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 构建的,并按预期启动。 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

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

这可能吗?如果不是,我是否犯了架构错误?

非常感谢您,我很感激!

编辑: 我偶然发现 nsenter 并使用 this and this 轻松进入容器的 shell。然而,这些都假设源(在他们的例子中是主机,在我的例子中是 jenkins 容器)安装了 Docker 以找到目标容器的 PID .我可以从主机 nsenter 进入 node-app,但是 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

试试上面的方法。您正在按图像名称链接,但您必须使用容器名称。 在您的情况下,由于您没有明确指定容器名称,因此它会像这样 auto-generated

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 守护进程执行,因为它是共享的).

来自 SO 的 提供了有关此问题的更多见解。