我不明白 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 套接字进程。
如何使脚本运行并同时保持容器运行?
当您启动容器时,它会运行您在ENTRYPOINT
或CMD
中定义的命令。 此命令通常会启动一个进程,只要此进程在前台运行,容器仍将运行。 如果进程在后台运行,容器将停止。 因此,如果您正在运行脚本,则需要确保它永远不会结束。 您可以通过在脚本末尾添加以下行来简单地实现这一点:
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 中,并且通常(但并非总是)是启动应用程序服务器的指令。