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

Ada*_*tan 14 exit-code docker

当容器退出时,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
Run Code Online (Sandbox Code Playgroud)

如何以编程方式获取数字退出代码,而不会出现容易出错grepcut-ing?

Ada*_*tan 22

docker inspect与模板一起使用:

$ docker inspect c2c769c4b9ef --format='{{.State.ExitCode}}'
1
Run Code Online (Sandbox Code Playgroud)


Rae*_*ald 13

退出状态docker run是包含命令的退出状态,除非Docker本身有问题(在这种情况下状态为125)或包含的命令无法调用(在这种情况下状态为126)或可能不被调用(在这种情况下,状态为 127)。

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

  • 在 C 或 C++ 程序或其他允许访问 POSIX API 的编程语言中,使用waitpid().
  • 在一POSIX像壳(这在实践手段最Unix外壳,包括bash),作为特殊的内容$?可变后立即的完成docker run
  • 在 Java 中,您过去常做的Process.exitValue()for的值。Processdocker run

如果您使用的是 Docker API,它应该提供对退出状态的访问。

  • 在使用Java Spotify的多克尔客户,价值ContainerExit.statusCode()的的ContainerExit对象返回的docker.waitContainer()


noa*_*amt 8

您可以使用echo

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

$ docker run debian bash -c "exit 0"
$ echo $?
0
Run Code Online (Sandbox Code Playgroud)

  • “$?扩展到最近执行的前台管道的退出状态。” - 如果您想知道“$”是什么?确实 - https://unix.stackexchange.com/questions/501128/what-does-echo-do/501129 (2认同)

Raf*_*afi 5

请注意,答案: https: //stackoverflow.com/a/46300611/2886980 可能有些欺骗性。

对于 Docker 版本 20.10.23 命令:

$ docker inspect c2c769c4b9ef --format={{.State.ExitCode}}
Run Code Online (Sandbox Code Playgroud)

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

这不太合理。我希望该命令返回运行容器的空字符串。否则无法区分容器是否已成功完成以及仍在运行的容器。

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

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

$ docker inspect c2c769c4b9ef --format={{.State.Status}}:{{.State.ExitCode}}
Run Code Online (Sandbox Code Playgroud)

结果将是:

running:0
Run Code Online (Sandbox Code Playgroud)

或者

exited:0
Run Code Online (Sandbox Code Playgroud)