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 "$@"
行中。如果您的入口点脚本减少到只有那一行,您可以将其删除。
我正在开发一个基于 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 "$@"
行中。如果您的入口点脚本减少到只有那一行,您可以将其删除。