docker compose在同级容器中执行命令

docker compose在同级容器中执行命令,docker,testing,docker-compose,end-to-end,Docker,Testing,Docker Compose,End To End,我正在围绕许多服务构建端到端测试套件。其中有些服务不是真正的服务。它们实际上是按顺序运行的过程脚本。这些命令在命令行执行,并接受参数,正如您希望脚本所做的那样 我们有这些脚本/应用程序的docker图像。我已将它们编译成docker compose文件。它们被定义为与端到端测试套件本身同级的服务。例如: docker compose.yml version: '3.4' services: script: build: https://${GITHUB_ACCESS}:@github

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

我们有这些脚本/应用程序的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_测试容器传递到
脚本
容器以执行它?

问题

您想从测试容器(
T1
,从图像
e2e测试:e2e
)调用位于脚本容器(
S1
,从图像
e2e\u测试:e2e
)内的命令(比方说
echo 1

解决方案

你可以利用这个可能性把它装到一个容器里

  • 将Docker套接字暴露于容器
    T1
    (应运行测试):

  • 现在,您可以从容器
    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)取决于您的特定用例。你可以:

    • 直接从
      e2e
    • 将其放入脚本中,由
      e2e的
      CMD
      执行
    • 使用docker-compose.yml为
      e2e

    安全性

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

    要了解威胁,请参阅:


    抽象的命名让我有些困惑。还有,你有没有办法在docker compose中演示如何做到这一点?例如,我是否应该向
    e2e_测试
    服务添加
    volumes
    关键字,例如:
    volumes:-/var/run/docker.sock:/var/run/docker.sock脚本
    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