我正在围绕许多服务构建端到端测试套件。其中一些服务并非真正的服务。它们实际上是按顺序运行的过程脚本。这些是在命令行执行并接受参数,就像您希望脚本一样。
我们为这些脚本/应用程序提供了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
容器以执行它?
答案 0 :(得分:1)
<强>问题强>
您想要从测试容器中调用位于脚本容器(echo 1
内部,从图像S1
派生)内的命令(让我们说script:e2e
) (T1
,来自图片e2e_tests:e2e
)
<强>解决方案强>
您可以使用expose the Docker socket到容器的可能性。
将Docker套接字暴露给容器T1
(应运行测试):
docker run -it --name T1 --volume /var/run/docker.sock:/var/run/docker.sock e2e_tests:e2e
现在,从容器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
)取决于您的具体用例。你可以:
CMD
e2e
CMD
内执行此操作
e2e
e2e
执行
entrypoint
安全强>
请注意docker套接字具有高权限(就像root一样)。因此暴露此套接字可能会带来安全隐患。它与在无密码sudo的系统上执行测试的级别相同,测试不会使用特权权限执行,但是能够修改测试的攻击者可以使用它来获取特权访问权限。这可能没问题,具体取决于您的威胁模型。
要了解威胁,请参阅: