在测试容器完成时终止docker compose

时间:2016-12-01 10:18:31

标签: docker docker-compose concourse

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

堆栈是从我的构建服务器(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}"

6 个答案:

答案 0 :(得分:39)

您可以使用这些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

答案 1 :(得分: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 $?

答案 2 :(得分:15)

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

您可以将test-runner分隔为它自己的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 /命令,然后手动运行测试命令

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

返回代码

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

答案 3 :(得分: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将触发相关服务的启动。

答案 4 :(得分:0)

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

案例1:docker-compose up -d

您可以使用docker-compose up -d,通过test-runner进行测试,然后以docker-compose down终止,但是使用docker-compose up -d时出现的问题是您赢得了 不再看到标准输出的日志

情况2:docker组成-从服务中退出代码

如果您使用--exit-code-from <service>表示--abort-on-container-exit,则可以view the docker logs,但是服务成功后将不会发送退出命令。然后 您需要捕获 ,您的容器已完成测试,然后发送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的解决方案,但是您需要等到过程完全完成后再打开输出日志文件,因此上述操作应该更容易

答案 5 :(得分:-1)

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

在您的情况下,您可以在量角器测试后添加ensure块,然后运行任务以拆除docker-compose之前的内容。您还可以使用on-success步骤https://concourse-ci.org/on-success-step.html进行拆解,如果您的测试失败,则会保留docker-compose个容器。