使用docker-compose与CI – 如何处理退出代码和守护进程的链接容器?

现在我们的Jenkins代理为我们的每个Rails项目生成一个docker-compose.yml,然后运行docker-compose up。 docker-compose.yml有一个主“web”容器,里面有rbenv和所有其他Rails依赖。它链接到包含测试Postgres DB的DB容器。

当我们需要实际运行测试和生成退出代码时,问题就来了。如果测试脚本返回退出0,我们的CI服务器将只部署,但是docker-compose总是返回0,即使其中一个容器命令失败。

另一个问题是,DB容器无限运行,即使在web容器运行测试之后,因此docker-compose从不返回。

有没有办法我们可以使用docker-compose这个过程?我们需要能够运行容器,但在Web容器完成后退出,并返回它的退出代码。现在,我们被卡住了,使用docker来启动DB容器,并使用–link选项运行web容器。

最佳答案
docker-compose run是获取所需退出状态的简单方法。例如:

$ cat docker-compose.yml 
roit:
    image: busybox
    command: 'true'
naw:
    image: busybox
    command: 'false'
$ docker-compose run --rm roit; echo $?
Removing test_roit_run_1...
0
$ docker-compose run --rm naw; echo $?
Removing test_naw_run_1...
1

或者,你可以选择inspect的死容器。您可以使用-f标志仅获取退出状态。

$ docker-compose up
Creating test_naw_1...
Creating test_roit_1...
Attaching to test_roit_1
test_roit_1 exited with code 0
Gracefully stopping... (press Ctrl+C again to force)
$ docker-compose ps -q | xargs docker inspect -f '{{ .Name }} exited with status {{ .State.ExitCode }}'
/test_naw_1 exited with status 1
/test_roit_1 exited with status 0

对于从不返回的db容器,如果你使用docker-compose up,那么你将需要sigkill那个容器;这可能不是你想要的。相反,您可以使用docker-compose up -d来运行您的容器守护进程,并在测试完成时手动终止容器。 docker-compose run应该为你运行链接的容器,但是我听到了关于一个bug的喋喋不休,阻止了现在的工作。

转载注明原文:使用docker-compose与CI – 如何处理退出代码和守护进程的链接容器? - 代码日志