测试容器完成时终止docker compose

Dav*_*son 27 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}"
Run Code Online (Sandbox Code Playgroud)

Mic*_*tor 60

您可以使用这些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
Run Code Online (Sandbox Code Playgroud)

下面的命令确保elasticsearchservice-api后下井service-test完成,并返回了退出代码service-test容器:

docker-compose -f docker-compose.yml up \
    --abort-on-container-exit \
    --exit-code-from service-test
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢你,我读了一半的互联网来找到你的解决方案:-) (12认同)
  • 同意,这很难找到 (5认同)
  • 的确。已加星标并点赞,以确保它不会再次丢失。 (3认同)
  • 很好的答案!顺便说一句,您可以省略 `--abort-on-container-exit` https://docs.docker.com/compose/reference/up/ (3认同)

won*_*ton 19

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

services:
  dynamodb:
  ...
  test_runner:
    ...
    depends_on:
      - dynamodb
Run Code Online (Sandbox Code Playgroud)

现在,您可以使用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 $?
Run Code Online (Sandbox Code Playgroud)

  • 不确定为什么不更多地支持它-在我看来,它比接受的答案更好地解决了问题。 (2认同)
  • 请注意,这不会破坏依赖关系,而不是 /sf/answers/3464011631/ (2认同)

Mat*_*att 16

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

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

分开试验跑步者

test-runner单独指定配置(您可能需要升级到版本2,networks而不是使用links跨多个撰写文件).

docker-compose up -d
docker-compose -f test-runner.yml run test-runner
rc=$?
docker-compose down
exit $rc
Run Code Online (Sandbox Code Playgroud)

没有op测试跑步者

默认test-runner为无操作入口/命令,然后手动运行测试命令

services:
  test-runner:
    image: "${RUNNER_IMG}"
    command: 'true'
Run Code Online (Sandbox Code Playgroud)

然后

docker-compose up -d
docker-compose run test-runner /launch-tests.sh
rc=$?
docker-compose down
exit $rc
Run Code Online (Sandbox Code Playgroud)

退货代码

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