Docker Compose:运行命令并检索文件

4
我有一个Docker Compose设置,其中包括20个不同的服务彼此相互依赖。通过使用docker-compose run my_service ...,我正在编写一个脚本来对容器运行测试。
然而,我遇到了几个问题:
1.测试完成后,应输出包含测试结果和覆盖率结果的XML文件。我希望我的脚本能够访问这两个文件。这是一项挑战,因为据我所知,在运行docker-compose run后,这些容器会被关闭。我唯一想到的解决方法是使用--entrypoint=tail -f /dev/null运行它,然后执行测试命令并检索文件。但这有点繁琐。有更好的方法吗?
2.测试完成后,我想停止并删除不仅是正在运行测试的容器,还有因其依赖而启动的所有容器。如何自动完成这个操作?

没有看到Dockerfile的内容,很难说。 - LinPy
2个回答

2
测试完成后,它们应该输出一个XML文件......如果您的任务的主要功能是读取或生成本地文件系统中的文件,则通常最好在Docker之外运行它。在集成测试的情况下,这甚至非常简单:不要在Docker容器内运行测试并指向其他容器的端点,而是在主机上运行测试并指向它们发布的端口。如果您的测试环境可以运行docker-compose命令,则可以将容器堆栈启动为测试夹具。如果由于某种原因它们必须在Docker中运行,则可以将主机目录绑定到容器中以接收结果文件。docker-compose run支持额外的-v卷挂载,因此您应该能够运行类似于...的内容。
docker-compose run -v $PWD/my_service_tests:/output my_service ..

我不仅想停止和删除我正在运行测试的容器,还想删除所有因为依赖它们而启动的容器。
我认为Docker Compose没有这个选项;它不是那么聪明的。考虑同时运行两个不同的测试用例的情况,每个测试用例都运行一个单独的测试容器,但共享一个数据库容器。第一个测试无法停止数据库容器,因为第二个测试正在使用它,但Compose并不真正意识到这一点。
如果您不介意为每个测试运行完整的隔离堆栈,则可以使用docker-compose -p选项来完成。然后,您可以使用docker-compose rm来清理特定测试运行的所有内容。
docker-compose -p test1 run -v $PWD/test1:/output my_service ...
docker-compose -p test1 stop
docker-compose -p test1 rm

考虑两个不同的测试案例[...]共享一个数据库容器。我认为docker-compose run的目的是运行与任何正在运行的容器分离的一次性命令,不是吗?文档说:“您使用run运行的命令在新容器中启动”,“docker-compose run命令不会创建服务配置中指定的任何端口”。您确定由docker-container run启动的容器可以与不相关的容器共享吗? - Ram Rachum
此外,尝试使用“-p”会导致“ERROR: Pool overlaps with other one on this address space”的错误,即使我停止并删除了所有容器。 - Ram Rachum
如果my_servicedepends_on: db,它将使用现有的数据库容器。文档中的示例使用docker-compose run来运行迁移,这本质上需要共享现有的数据库。 - David Maze

1
在测试完成后,它们应该输出包含测试结果和覆盖率结果的XML文件。我希望我的脚本调用docker-compose时能够访问这两个文件。
您可以将测试报告写入容器内的某个文件夹。可以使用卷将此文件夹映射到Docker主机上的文件夹中。因此运行docker-compose命令的脚本将能够使用它们。
这是一个挑战,因为据我所知,在运行docker-compose run之后,这些容器会被关闭。
它们被停止了。但是,下次运行docker-compose up时,它们会重新启动保留已挂载的卷注意
Compose缓存用于创建容器的配置。当您重新启动未更改的服务时,Compose会重复使用现有的容器。重复使用容器意味着您可以非常快速地对环境进行更改。
这意味着,即使容器已停止运行,您仍可以使用docker cp命令复制测试服务生成的报告文件。无论如何,docker cp都应该能够正常工作,不受卷的影响。例如,假设测试已将reports.xml写入容器内部的/test_reports文件夹中,您可以在测试容器停止后使用docker cp将文件复制到主机。

示例, 示例2


在测试完成后,我想停止和删除不仅是正在运行测试的容器,还有所有因为它而启动的容器。如何自动完成?


使用docker-compose down

该命令

Stops containers and removes containers, networks, volumes, and images created by up.

如果您在同一组合文件中定义了待测试的服务及其所有依赖服务和测试服务本身,则该命令将起作用。

使用示例


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接