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"]