Docker 图片无法在前景模式下 运行 处理

Docker image fails to run process in foreground mode

我正在开发一个基于 nvidia/cuda:10.1-base-ubuntu18.04 的 docker 映像。在构建时安装了一个自定义 Web 服务器,我有一个 docker-entrypoint.sh,它 运行 是服务器,具体取决于是否在 运行 时间设置了环境变量。

如果我 运行 容器处于交互模式,一切正常:

docker run -it -p 5000:5000 -e RUN_SERVER=1 myImage/17.5.360/all /bin/bash

或者使用旧的 "hack" 来保持图像的活力:

docker run -d -p 5000:5000  -e RUN_SERVER=1 myImage/17.5.360/all /bin/bash -c "tail -f /dev/null"

但是当我按照 的最新答案时:

docker run -t -d -p 5000:5000 -e RUN_SERVER=1 myImage/17.5.360/all

图像似乎加载成功并保持活动状态,但服务器未激活。

这是docker-entrypoint.sh的删节版:

#! /bin/bash
if [ $RUN_SERVER = "1" ]; then
   runMyServer
fi
exec "$@"

和 Dockerfile:

FROM nvidia/cuda:10.1-base-ubuntu18.04 AS HInstaller  
ENV RUN_SERVER=0  # Defaults to not run the server

# ...

COPY "./docker-entrypoint.sh" /usr/local/bin/
ENTRYPOINT ["docker-entrypoint.sh"]

如何调试交互模式工作后发生的情况?

您的入口点脚本以行结尾

exec "$@"

这意味着用作为命令行参数传递的任何内容替换当前进程。当同时存在入口点和命令时,命令将作为参数传递给入口点。

在您的前两个示例中,您在 docker run 命令行上给出了一些命令,只要保持 运行ning,容器就会保持 运行ning。在您的最后两个示例中,命令行或 Dockerfile CMD 指令中缺少任何内容,该命令将为空。此 exec 行不会执行任何操作,入口点脚本将成功完成。

拥有一个 运行 交互式 shell 或无意义的 tail 命令的容器并不是很好的做法,并且作为副作用 运行 一些服务。您希望将服务作为前台进程启动,并使其成为主容器进程。服务在后台启动是额外的工作,因此通常会有某种 "foreground" 选项来绕过它。如果你输入类似

CMD ["runMyServer", "--foreground"]

这将 运行 在那 exec "$@" 行中。如果您的入口点脚本减少到只有那一行,您可以将其删除。