我目前正在运行一个docker-compose堆栈,用于基本的集成测试,使用一个量角器测试运行器,一个nodejs服务器服务于网页,一个wildfly服务器服务于java后端。
这个堆栈是从我的构建服务器(concourse ci)中的dind(docker in docker)容器运行的。
但是,容器似乎在完成量角器测试时不会终止。
- 由于wildfly和nodejs的容器仍在运行,因此构建任务永远不会完成... *
测试完成后,如何使合成以成功或失败结束?
# Test runner
test-runner:
image: "${RUNNER_IMG}"
privileged: true
links:
- client
- server
volumes:
- /Users/me/frontend_test/client-devops:/protractor/project
- /dev/shm:/dev/shm
entrypoint:
- /entrypoint.sh
- --baseUrl=http://client:9000/dist/
- /protractor/conf-dev.js
- --suite=remember
# Client deployment
client:
image: "${CLIENT_IMG}"
links:
- server
# Server deployment
server:
image: "${SERVER_IMG}"
7条答案
按热度按时间aiazj4mn1#
你可以使用这些docker-compose参数来实现:
--abort-on-container-exit
如果有容器停止,则停止所有容器。--exit-code-from
返回所选服务容器的退出代码。例如,有这个
docker-compose.yml
:以下命令确保
elasticsearch
和service-api
在service-test
完成后关闭,并从service-test
容器返回退出代码:cbjzeqam2#
Compose在
docker-compose up
中添加了--exit-code-from {container}
标志,这使得这更容易。请参阅Michael Spector's answer了解更多详细信息。
原始应答
与此rspec q/a类似,您需要将测试作为独立任务运行,并将退出状态报告给CI。
您可以将test-runner分离到它自己的yaml中,或者修改test-runner以默认为no op命令/入口点。
分离测试运行器
单独指定
test-runner
配置(您可能需要升级到版本2networks
,而不是使用links
来跨多个编写文件工作)。无op测试运行器
将
test-runner
默认为no op entrypoint/命令,然后手动运行test命令然后
返回码
如果您的CI有“post tasks”的概念,您可能可以跳过
rc
捕获,而在test-runner CI任务完成后运行docker-compose down
。您的CI也可能会为您清理容器。fcy6dtqo3#
我发现最优雅的解决方案是在
docker-compose.yml
文件中使用depends_on
。现在你可以使用
docker-compose run --rm test_runner
来设置你的依赖,运行你的测试,删除所有的东西,并传播返回代码。13z8s7eq4#
我已经尝试了这次讨论中提出的解决办法,但问题仍然存在
Case-1:docker-compose up -d
你可以使用
docker-compose up -d
,通过test-runner
测试它,然后通过docker-compose down
终止,但是当你使用docker-compose up -d
时,问题是***你将不再看到标准输出的日志***。用例2:docker-compose up --exit-code-from a service
如果你使用
--exit-code-from <service>
,这意味着--abort-on-container-exit
,但服务不会在成功时发送exit命令,那么你可以view the docker logs。然后***你需要在发送docker-compose down
之前捕获***你的容器完成测试以停止它们。在终止to see the logs之前,解决方案之一是使用
--tail=1000 -f
还有一个使用
nohup
的解决方案,但您需要等到进程完全完成,然后打开输出日志文件,因此上面的操作应该更简单。bjg7j2ky5#
我的
docker compose up
有一些标志组合(--build
),可以防止在--abort-on-container-exit
触发时停止所有服务容器。例如:
将启动
service1
和service2
,但只会在中止时停止service1
,因为就Docker而言,它只负责构建service1
,并且拒绝假设service2
不是预先存在的-即使它是,你知道,在同一个docker-compose.yml中定义并与depends_on
链接,* 它只是启动它。* 它只是让service2
运行。1要解决这个问题,我需要做的就是确保在
docker compose up
之后运行docker compose down
。这可以使用
trap
来完成,以确保它始终运行,即使docker compose up
失败并提前退出脚本:脚注
1:这对我来说是个问题,因为我的
service1
期望它的service2
处于新鲜状态。aiqt4smr6#
为了避免单独的配置文件,您可以更新docker-compose配置,通过depends_on选项引入服务之间的依赖关系,从版本2 format开始提供。因此,启动
test-runner
将启动客户端的运行。请注意,如果您需要等待一段时间,实际的Web服务器将从您正在测试的内部服务启动,您可以使用wait-for-it.sh脚本等待,直到服务器可用。
更新配置后,简单的
docker-compose up test-runner
将触发相关服务的启动。ef1yzkbh7#
您可以在Concourse中的任务步骤上使用
ensure
执行清理任务。https://concourse-ci.org/ensure-step.html在你的例子中,你可以在量角器测试后添加一个
ensure
块,然后运行一个任务来拆除之前docker-compose
的东西。你也可以使用on-success
步骤https://concourse-ci.org/on-success-step.html来执行拆除,如果测试失败,docker-compose
的容器将被保留。