【问题标题】:docker-compose execute command in sibling containerdocker-compose 在同级容器中执行命令
【发布时间】:2018-01-31 22:25:07
【问题描述】:

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

我们为这些脚本/应用提供了 docker 镜像。我已经将它们编译成一个 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 容器以执行它?

【问题讨论】:

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


    【解决方案1】:

    问题

    您想从您的测试容器(T1,派生自图像@ 987654330@)

    解决方案

    您可以使用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,因此您可以直接解析/使用它。


    如何将其传输到 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)取决于您的特定用例。你可以:

    • 直接在CMDe2e 中执行此操作
    • 放入脚本,由CMDe2e执行
    • 使用 docker-compose.yml 为e2e 指定entrypoint

    安全

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

    要了解威胁,请参阅:

    【讨论】:

    • 我对抽象的命名有点困惑。另外,有什么方法可以在 docker compose 中展示如何做到这一点?例如,我是否应该将 volumes 关键字添加到 e2e_tests 服务,例如:volumes: - /var/run/docker.sock:/var/run/docker.sock script
    猜你喜欢
    • 2023-01-28
    • 1970-01-01
    • 2019-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-06
    • 1970-01-01
    相关资源
    最近更新 更多