docker-在兄弟容器中编写执行命令

docker-compose execute command in sibling container

我正在围绕一些服务构建一个端到端的测试套件。其中一些服务并不是真正的服务。它们实际上是顺序为 运行 的程序脚本。这些在命令行执行并接受参数,就像您期望脚本那样。

我们有 docker 个图像 scripts/apps。我已将它们编译成 docker-compose 文件。它们在那里被定义为与端到端测试套件本身同级的服务。所以,例如:

docker-compose.yml

version: '3.4'
services:
  script:
    build: https://${GITHUB_ACCESS}:@github.com/company/script.git
    image: script:e2e
  e2e_tests:
    build: .
    image: e2e:e2e

现在,e2e服务需要执行脚本。由于脚本不是服务,我无法进行简单的 api 调用。我如何将命令从 e2e_tests 容器传递到 script 容器以执行它?

问题

您想从测试容器 (T1,来源于图片e2e_tests:e2e)

解决方案

您可以利用 expose the Docker socket 到容器的可能性。

  1. 将 Docker 套接字暴露给容器 T1(应该 运行 测试):

    docker run -it --name T1 --volume /var/run/docker.sock:/var/run/docker.sock e2e_tests:e2e
    
  2. 现在您可以从容器 T1 中启动其他容器。这也可用于启动脚本容器 S1 并执行命令:

    docker run --name S1 scipt:e2e echo 1
    1
    

命令的输出(此处echo 1)将通过管道传输到T1,因此您可以直接parse/use它。


如何把这个转成docker-compose.yml?

version: '3.4'
services:
  script:
  build: https://${GITHUB_ACCESS}:@github.com/company/script.git
  image: script:e2e
e2e_tests:
  build: .
  image: e2e:e2e
  volumes: /var/run/docker.sock:/var/run/docker.sock

在哪里放置测试的实际执行(反过来必须执行 docker run ... echo 1)取决于您的具体用例。你可以:

  • 直接从 e2e CMD
  • 中执行
  • 写成脚本,由e2eCMD执行
  • 使用 docker-compose.yml 为 e2e
  • 指定 entrypoint

安全

请注意 docker 套接字具有高特权(类似于 root)。因此,公开此套接字可能会带来安全隐患。它与使用无密码 sudo 在系统上执行测试处于同一级别,测试不会以特权权限执行,但是能够修改测试的攻击者可以使用它来获得特权访问。这可能没问题,具体取决于您的威胁模型。

要了解威胁,请参阅: