如何获取已退出的Docker容器的数字退出状态?

38

当容器退出时,docker ps -a 显示其退出码(滚动查看)

$ docker run ubuntu bash -c "exit 1"
CONTAINER ID   IMAGE    COMMAND              CREATED        STATUS                     PORTS                     NAMES
c2c769c4b9ef   ubuntu   "bash -c 'exit 1'"   6 seconds ago  Exited (1) 3 seconds ago                             happy_fermat

如何以编程方式获取数值退出代码,而无需使用容易出错的grepcut操作?

5个回答

53

使用模板与docker inspect命令:

$ docker inspect c2c769c4b9ef --format='{{.State.ExitCode}}'
1

1
请注意,在某些情况下,此答案可能是具有欺骗性的。请查看我的答案:https://dev59.com/sFYO5IYBdhLWcg3wIuPp#75836395 - Rafi
小心点。如果你的容器没有像问题一样设计退出并且“挂起”,你可以看到正在运行的容器有一个ExitCode。另请参阅,https://stackoverflow.com/q/77296413/20307768 - undefined

26
你可以使用 echo
$ docker run debian bash -c "exit 1"
$ echo $?
1

$ docker run debian bash -c "exit 0"
$ echo $?
0

4
"$?"代表最近执行的前台管道的退出状态。如果你想知道"$?"的作用,请参考 https://unix.stackexchange.com/questions/501128/what-does-echo-do/501129。 - gbro3n

22

Docker run 的退出状态 是包含的命令的退出状态,除非 Docker 本身出现问题(此时状态为125)或者无法调用包含的命令(此时状态为126)或者无法找到包含的命令(此时状态为127)。

因此,当您将 docker run 作为子进程执行时,可以像处理其他子进程一样检索退出状态:

  • 在 C 或 C++ 程序中,或者其他允许使用 POSIX API 的编程语言中,使用 waitpid() 函数。
  • 在类 POSIX shell(实际上是大多数 Unix shell,包括 bash)中,通过特殊的 $? 变量,在 docker run 完成后立即获取退出状态。
  • 在 Java 中,使用进行 docker runProcessProcess.exitValue() 方法。

如果您正在使用 Docker API,则应该提供访问退出状态的功能。

  • 使用Spotify Docker客户端在Java中,docker.waitContainer()返回的ContainerExit对象的ContainerExit.statusCode()值。

4
请注意答案:https://dev59.com/sFYO5IYBdhLWcg3wIuPp#46300611 可能有些误导性。
至于 Docker 版本 20.10.23 命令:
$ docker inspect c2c769c4b9ef --format={{.State.ExitCode}}

对于正在运行的容器以及退出代码为0的容器,将返回0。

这不是很合理。我希望该命令对于正在运行的容器返回空字符串。否则,无法区分已成功完成的容器和仍在运行的容器。

这意味着,如果您不确定容器是否已退出,则代码0可能会给您带来麻烦。

对于这种情况,更好的选择是:

$ docker inspect c2c769c4b9ef --format={{.State.Status}}:{{.State.ExitCode}}

结果将是:

running:0

或者

exited:0

3

您可以使用:

docker wait c2c769c4b9ef

如果容器已经停止,您可以直接获取退出代码。

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