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 到容器的可能性。
将 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,因此您可以直接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
中执行
- 写成脚本,由
e2e
的CMD
执行
- 使用 docker-compose.yml 为
e2e
指定 entrypoint
安全
请注意 docker 套接字具有高特权(类似于 root)。因此,公开此套接字可能会带来安全隐患。它与使用无密码 sudo 在系统上执行测试处于同一级别,测试不会以特权权限执行,但是能够修改测试的攻击者可以使用它来获得特权访问。这可能没问题,具体取决于您的威胁模型。
要了解威胁,请参阅:
- whosebug.com - Access Docker socket within container
- Don't expose the Docker socket (not even to a container)
- docker.com - Docker daemon attack surface
我正在围绕一些服务构建一个端到端的测试套件。其中一些服务并不是真正的服务。它们实际上是顺序为 运行 的程序脚本。这些在命令行执行并接受参数,就像您期望脚本那样。
我们有 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 到容器的可能性。
将 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,因此您可以直接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
中执行
- 写成脚本,由
e2e
的CMD
执行 - 使用 docker-compose.yml 为
e2e
指定
entrypoint
安全
请注意 docker 套接字具有高特权(类似于 root)。因此,公开此套接字可能会带来安全隐患。它与使用无密码 sudo 在系统上执行测试处于同一级别,测试不会以特权权限执行,但是能够修改测试的攻击者可以使用它来获得特权访问。这可能没问题,具体取决于您的威胁模型。
要了解威胁,请参阅:
- whosebug.com - Access Docker socket within container
- Don't expose the Docker socket (not even to a container)
- docker.com - Docker daemon attack surface