Docker 中的 /var/run 持久化

Docker 中的 /var/run 持久化

我刚刚在(Debian)Docker 容器中遇到了 PID 文件问题,该容器配置为--restart always

试图总结一下问题:

  1. apache2我在容器中启动服务。 init服务创建一个PID文件/var/run/apache2/apache2.pid
  2. docker kill的容器模拟主机的不正确关闭(电气故障),服务被非正常终止,因此 PID 文件仍然存在。
  3. 我再次启动容器(模拟主机重新启动),并尝试apache2再次启动服务。如果重复使用 PID(另一个程序使用正在运行 httpd 的 PID),则启动服务将失败。

要正确启动服务,我必须:

  1. 运气好的话,回收的 PID 会被释放
  2. 手动删除PID文件

显然,解决方案 1 不是一个解决方案。

解决方案 2. 被多次提及,但在我看来并不是一个解决方案,因为它涉及在我的入口点或 cmd 中为我在容器中启动的每个服务执行此操作。并且还知道特定图像使用 PID 文件,但假设可能不正确。

我可以看到一些增强功能:

  1. /var/run意味着要么是易失性的(tmpfs),要么是在操作系统启动时清理的,所以我可以在容器启动时 rm 全部内容(已经比删除特定的 PID 文件更好了)
  2. 安装/var/run临时文件系统在创建容器时,以便在容器启动时为我清理它

tmpfs 解决方案对我来说似乎完美无缺(真的吗?),所以我想知道是否有一个系统的解决方案将其应用到我所有的容器部署(docker、docker compose 等),或者是否有任何缺点每次都应用吗?因为在我看来,我需要永远将其应用于我的所有容器部署,并且如果可能的话,我不想必须明确地执行此操作。

相关内容