从docker-compose up命令中获取退出代码

6

我在使用 docker-compose up 命令时遇到了获取退出代码的问题。
我的容器非常简单,只运行一个总是以 1 退出的脚本:

#!/usr/bin/env sh
exit 1

我的 Dockerfile:
FROM mhart/alpine-node:6
RUN mkdir /app
WORKDIR /app

我的 docker-compose.yml 文件如下:
version: '2'

services:
  test_container:
    container_name: test_container
    build: .
    volumes:
      - ${PWD}/run.sh:/app/run.sh
    entrypoint: ["/app/run.sh"]

当我使用以下命令运行它时:
docker-compose -f docker-compose.yml up --force-recreate test_container

我可以在日志中看到:

Recreating test_container ... 
Recreating test_container ... done
Attaching to test_container
test_container exited with code 1

但是当我执行 echo $? 命令时,返回的是0
我的Docker版本是17.09.0-ce,构建版本为afdb6d4。运行在OSX 10.12.6上。
我做错了什么吗?这是否是已知问题(我在网上找不到相关信息)?


我不明白为什么要返回 1,因为 docker-compose 已经成功运行了。 - tgogos
docker-compose run/exec 命令会返回被运行容器的退出码。 - Daniel Gruszczyk
1
我认为这是因为你使用execrun定义了一个特定的容器。但是使用docker compose up,你可能会有一组容器。例如,如果你在你的情况下有另一个名为test_container_2的容器以退出状态码0退出,那么你期望从echo $?得到什么呢? - tgogos
为什么不尝试使用 docker inspect 命令获取容器的退出代码? - tgogos
是的,我想我必须这样做。 - Daniel Gruszczyk
1个回答

14

docker-compose up 命令可以使用选项--exit-code-from SERVICE :)

来自文档

docker compose up

Options:
    --exit-code-from SERVICE   Return the exit code of the selected service container.
                               Implies --abort-on-container-exit.

    --abort-on-container-exit  Stops all containers if any container was stopped.
                               Incompatible with -d.

    -d                         Detached mode: Run containers in the background,
                               print new container names.
                               Incompatible with --abort-on-container-exit.

1
很好!我从文档中添加了一些信息,我认为应该提到... - tgogos
1
“--exit-code-from SERVICE” 不是很清楚,所以我快速测试了一下。如果您直接失败的服务,则它将返回实际的退出代码,但如果没有,则返回 SIGTERM(128)。 - dtc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接