Docker 在 healthcheck 监控的进程崩溃后没有干净地启动容器
Docker doesn't start container cleanly after a process monitored by healthcheck crashes
我有一个 docker-compose 有几个服务。其中一个容器内的受监视进程有时会崩溃,healtcheck 会检测到这一点并重新启动容器。服务已配置:
重启:除非停止
但是有一个问题,因为重启后rsyslog的pid没有被删除,无法启动。我可以通过在启动 rsyslog 之前删除启动脚本中的 pid 来解决这个问题,但我认为它不应该这样做。 Docker 重启后容器id是一样的。它的行为就像它在进程崩溃后提交了容器,然后它再次 运行 启动脚本。例如。容器没有干净地启动,但内部所做的更改仍然存在。 pid 位置不是卷。我阅读了关于该主题的 docker 文档 - https://docs.docker.com/config/containers/start-containers-automatically/ 但找不到任何有用的信息。有什么想法吗?
容器重启实际上并没有删除和重新创建容器或其文件系统;它只是重新启动现有容器中的主进程。
由于一个容器只运行一个进程,所以无条件删除pid文件是安全的。我倾向于为此使用入口点包装器脚本:
#!/bin/sh
# Delete the pid file, if it exists
rm -f /var/run/rsyslog.pid
# Run whatever the image CMD or `docker run` command is
exec "$@"
在您的 Dockerfile 中,将此脚本设为 ENTRYPOINT
,并保持现有的 CMD
不变:
COPY entrypoint.sh .
ENTRYPOINT ["./entrypoint.sh"]
CMD ["rsyslogd", "--no-daemon"]
我有一个 docker-compose 有几个服务。其中一个容器内的受监视进程有时会崩溃,healtcheck 会检测到这一点并重新启动容器。服务已配置: 重启:除非停止 但是有一个问题,因为重启后rsyslog的pid没有被删除,无法启动。我可以通过在启动 rsyslog 之前删除启动脚本中的 pid 来解决这个问题,但我认为它不应该这样做。 Docker 重启后容器id是一样的。它的行为就像它在进程崩溃后提交了容器,然后它再次 运行 启动脚本。例如。容器没有干净地启动,但内部所做的更改仍然存在。 pid 位置不是卷。我阅读了关于该主题的 docker 文档 - https://docs.docker.com/config/containers/start-containers-automatically/ 但找不到任何有用的信息。有什么想法吗?
容器重启实际上并没有删除和重新创建容器或其文件系统;它只是重新启动现有容器中的主进程。
由于一个容器只运行一个进程,所以无条件删除pid文件是安全的。我倾向于为此使用入口点包装器脚本:
#!/bin/sh
# Delete the pid file, if it exists
rm -f /var/run/rsyslog.pid
# Run whatever the image CMD or `docker run` command is
exec "$@"
在您的 Dockerfile 中,将此脚本设为 ENTRYPOINT
,并保持现有的 CMD
不变:
COPY entrypoint.sh .
ENTRYPOINT ["./entrypoint.sh"]
CMD ["rsyslogd", "--no-daemon"]