测试容器完成时终止docker compose

问题描述 投票:22回答:6

我目前正在运行一个docker-compose堆栈,用于基本集成测试,包括量角器测试运行器,服务于网页的nodejs服务器和服务于java后端的wildfly服务器。

堆栈是从我的构建服务器(大厅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}"
docker docker-compose concourse
6个回答
15
投票

与此rspec q/a类似,您需要将测试作为独立任务运行,将退出状态报告回CI。

您可以将测试运行器分成它自己的yaml,或者将test-runner修改为默认为no op命令/入口点。

分开试验跑步者

单独指定test-runner配置(您可能需要升级到version 2 networks而不是使用links来处理多个撰写文件)。

docker-compose up -d
docker-compose -f test-runner.yml run test-runner
rc=$?
docker-compose down
exit $rc

没有测试跑步者

test-runner默认为no op entrypoint /命令,然后手动运行test命令

services:
  test-runner:
    image: "${RUNNER_IMG}"
    command: 'true'

然后

docker-compose up -d
docker-compose run test-runner /launch-tests.sh
rc=$?
docker-compose down
exit $rc

Return codes

如果您的CI具有“发布任务”的概念,您可以跳过rc捕获并在测试运行器CI任务完成后运行docker-compose down。您的CI也可以为您清理容器。


46
投票

您可以使用这些docker-compose参数来实现:

--abort-on-container-exit如果任何容器停止,则停止所有容器。

--exit-code-from返回所选服务容器的退出代码。

例如,有这个docker-compose.yml

version: '2.3'

services:
  elasticsearch:
    ...
  service-api:
    ...
  service-test:
    ...
    depends_on:
      - elasticsearch
      - service-api

以下命令确保在elasticsearch完成后service-apiservice-test关闭,并从service-test容器返回退出代码:

docker-compose -f docker-compose.yml up \
    --abort-on-container-exit \
    --exit-code-from service-test

18
投票

我发现最优雅的解决方案是在depends_on文件中使用docker-compose.yml

services:
  dynamodb:
  ...
  test_runner:
    ...
    depends_on:
      - dynamodb

现在你可以使用docker-compose run --rm test_runner来设置你的依赖项,运行你的测试,拆除一切,并传播返回代码。

docker-compose run test_runner false
Starting test_dynamodb_1 ... done
echo $?
1
docker-compose run test_runner true
Starting test_dynamodb_1 ... done
echo $?

0
投票

为了避免使用单独的配置文件,您可以更新docker-compose配置,以使用depends_on选项引入服务之间的依赖关系,该选项可从版本2格式开始提供。因此,test-runner的开始将启动客户的运行。

请注意,如果您需要等待一段时间从您正在测试的内部服务启动实际的Web服务器,您可以使用wait-for-it.sh脚本等待服务器可用。

# 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
  depends_on:
    - client
  entrypoint:
    - wait-for-it.sh
    - client
    - -t
    - '180'
    - --
    - /entrypoint.sh
    - --baseUrl=http://client:9000/dist/
    - /protractor/conf-dev.js
    - --suite=remember
# Client deployment
client:
  image: "${CLIENT_IMG}"
  depends_on:
    - server
  links:
    - server
# Server deployment
server:
  image: "${SERVER_IMG}"

更新配置后,简单的docker-compose up test-runner将触发相关服务的启动。


0
投票

我已经尝试过本次讨论中提供的解决方案,但问题仍然存在

案例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-service

你可以使用view the docker logs,如果你使用--exit-code-from <service>暗示--abort-on-container-exit,但服务在成功时不会发送exit命令。然后你需要抓住你的容器完成测试后再发送docker-compose down来阻止他们。

在终止它们之前解决to see the logs的解决方案之一是使用--tail=1000 -f

docker-compose up -d
docker-compose logs --tail=1000 -f test-runner
docker-compose down
exit $rc

还有一个使用nohup的解决方案,但你需要等到进程完全完成然后打开输出日志文件,所以上面应该更容易


-1
投票

您可以在Concourse的任务步骤中使用ensure执行清理任务。 https://concourse-ci.org/ensure-step.html

在你的情况下,你可以在量角器测试后添加一个ensure块,并运行一个任务来拆除之前的docker-compose。您也可以使用on-successhttps://concourse-ci.org/on-success-step.html进行拆解,如果您的测试失败,将保留docker-compose'd容器。

© www.soinside.com 2019 - 2024. All rights reserved.