Docker Compose:运行命令,然后检索文件

时间:2019-11-06 12:42:53

标签: docker docker-compose

我有一个Docker compose设置,其中有20个相互依赖的不同服务。我正在编写一个脚本,该脚本使用cacheRedirects: { Query: { node: (_, args, { getCacheKey }) => { const cacheKey = getCacheKey({ __typename: "Item", id: args.id, }); return cacheKey; }, }, }, 在容器上运行测试。

尽管如此,我还是遇到了一些问题:

  1. 测试完成后,他们应该输出带有测试结果的XML文件和带有覆盖率结果的XML文件。我希望调用docker-compose run my_service ...的脚本可以访问这两个文件。这是一个挑战,因为据我所知,在运行docker-compose之后,这些容器将关闭。我能想到的唯一解决方案是使用docker-compose run运行它,然后执行测试命令并检索文件。但这有点麻烦。有更好的方法吗?
  2. 测试完成后,我不仅要停止并删除正在运行测试的容器,还要删除所有启动的容器,因为它依赖于它们。我如何自动做到这一点?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

  
      
  1. 测试完成后,他们应该输出带有测试结果的XML文件和带有覆盖率结果的XML文件。我要我的   调用docker-compose的脚本可以访问这两个脚本   文件。
  2.   

您可以将测试报告写入容器内的某个文件夹。该文件夹可以使用卷映射到Docker主机上的文件夹。因此,运行docker-compose命令的脚本将能够使用它们。

  

这是一个挑战,因为据我所知,跑步后   docker-compose运行,这些容器被关闭。

它们已停止。但是,下次您运行docker-compose时,它们将重新启动preserving mounted volumes

Note

  

Compose缓存用于创建容器的配置。当你   重新启动未更改的服务,Compose重用现有的服务   容器。重复使用容器意味着您可以更改   您的环境很快。

这意味着即使容器退出后,您也可以使用docker cp命令复制由测试服务生成的报告文件。

docker cp应该可以正常工作,无论其数量如何。例如,假设测试已将reports.xml写入容器内的/test_reports文件夹。测试容器停止后,您可以使用docker cp将文件复制到主机。

ExampleExample2

  

测试完成后,我想停止并删除不仅   我正在对所有已启动的容器进行测试的容器   因为它取决于他们。我该如何自动做到?

使用docker-compose down

The command

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

如果您使用所有相关服务定义了被测服务,并且测试服务本身位于同一撰写文件中,则该命令将起作用。

Usage example