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

时间:2018-01-31 22:25:08

标签: docker testing docker-compose end-to-end

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

我们为这些脚本/应用程序提供了docker镜像。我已将它们编译成docker-compose文件。它们被定义为服务,它们是端到端测试套件本身的兄弟。所以,例如:

搬运工-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容器以执行它?

1 个答案:

答案 0 :(得分:1)

<强>问题

您想要从测试容器中调用位于脚本容器(echo 1内部,从图像S1派生)内的命令(让我们说script:e2e) (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
    
  3. 命令的输出(此处为echo 1)将通过管道传输到T1,因此您可以直接解析/使用它。

    如何将其转移到 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)取决于您的具体用例。你可以:

    • 直接在CMD e2e
    • CMD内执行此操作
    • 将其放入脚本中,该脚本由e2e
    • e2e执行
    • 使用docker-compose.yml为{{1}}
    • 指定entrypoint

    安全

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

    要了解威胁,请参阅: