Docker 容器保持正常运行



我不明白 docker 容器如何保持正常运行。据我所知,如果容器没有任何活动进程,它将独立于给定的命令自动关闭。

这就是我指示我的docker-compose.yml执行此命令以使其保持活动状态的原因:

gateway:
build: .
image: me/gateway
container_name: gateway
command: tail -F /dev/null <------
#    restart: always
ports:
- "10091:10091"
volumes:
- ./logs:/root/logs
- vendor:/root/vendor
- .:/root
env_file:
- .env 

而我的Dockerfile执行以下操作:

FROM php:7-fpm-alpine
EXPOSE 10091
WORKDIR /root
COPY . .
COPY src/scripts/generateConfig.sh /usr/local/bin/generateConfig
RUN ["chmod", "+x", "/usr/local/bin/generateConfig"]

在这种情况下,容器会保持正常运行,一切都很好。但是,我想在容器启动后运行脚本,因此我在Dockerfile末尾添加了额外的行:

ENTRYPOINT ["generateConfig"]

运行命令后,容器会自动停止。当我检查日志时没有错误,因为脚本按预期完成工作。脚本负责无限期地运行 Ratchet Web 套接字进程。

如何使脚本运行并同时保持容器运行?

当您启动容器时,它会运行您在ENTRYPOINTCMD中定义的命令。 此命令通常会启动一个进程,只要此进程在前台运行,容器仍将运行。 如果进程在后台运行,容器将停止。 因此,如果您正在运行脚本,则需要确保它永远不会结束。 您可以通过在脚本末尾添加以下行来简单地实现这一点:

tail -f <some log file> # keep listening on your application log file.

或者,您可以在 true 时添加一些:

while true; sleep 2; done 

希望会有所帮助

我发现了这个问题。命令启动 Web 套接字进程的脚本有以下行开头:

nohup php ${serviceProcess} >> /dev/null 2>&1 &

解决方案不是仅使用以下方法抑制输出:

nohup php ${serviceProcess}

现在运行良好

快速回答

如果你的 docker run 命令看起来像这样

docker run yourimage

将其更改为此

docker run -dt --entrypoint bash yourimage

现在运行docker ps,您应该看到它正在运行。

为什么您的容器没有保持运行?

Dockerfile 包含有关构建映像的说明。通常有一个ENTRYPOINT指令(通常在 Dockerfile 的末尾),告诉映像在启动时要做什么。如果缺少该指令(或者如果指令执行得非常快),容器将启动,但很快就会停止,因为它没有被告知执行任何长时间运行的进程。

这就是为什么手动向docker run命令提供指令的原因(例如entrypoint bash) 将保持容器运行 - 您实际上是在说"打开 bash shell,之后不要做任何其他事情",所以容器这样做,这就是保持它运行的原因。

大多数情况下,您可能希望将入口点指令烘焙到 Dockerfile 中,并且通常(但并非总是)是启动应用程序服务器的指令。

最新更新