【问题标题】:Docker restart stuck in loop for rails applicationDocker重启卡在rails应用程序的循环中
【发布时间】:2021-08-21 21:20:53
【问题描述】:

我有一个在 VPS 中运行的容器化 Rails 应用程序。

构建映像后,我的部署脚本执行以下操作来运行容器:

docker run \
    -v /home/user/my-app/public:/home/rails/my-app/public \
    -v /home/user/my-app/log:/home/rails/my-app/log \
    -p 1337:1337 \
    --restart=always \
    -d \
    my-image

它只是挂载一些卷并将重启策略设置为始终。到这里一切正常。

但是,有时我的 rails 应用程序内存不足(短期内无法解决此问题),因此 docker 会杀死容器。发生这种情况时,我希望 rails 应用程序会自动重新启动。

但有时 docker 会陷入重启容器的循环中,因为一旦重启,rails 就会说服务器已经在运行并退出。这是运行docker logs的结果

=> Booting Puma
=> Rails 6.1.3.1 application starting in production 
=> Run `bin/rails server --help` for more startup options
A server is already running. Check /home/rails/my-app/tmp/pids/server.pid.
Exiting

我不完全确定为什么在容器停止并重新启动后该文件仍然存在。这个文件不应该是短暂的吗?另外我不知道如何去解决这个问题。关于 docker restart 政策的文档并没有深入说明重新启动的实际作用。也许我必须添加一个 docker-entrypoint.sh 并在那里手动删除该文件?如果是这样,也许对于在 VPS 上运行的生产 Rails 应用程序有推荐的设置?

【问题讨论】:

标签: ruby-on-rails docker deployment vps production


【解决方案1】:

原来重启并没有 rm 容器,因此写入容器中的数据会在包括 tmp/pids/server.pid 在内的重启后持久化。

寻找更多信息我发现了这两个选项:

  • 删除 docker-entrypoint.sh 文件中的 server.pid 文件。根据 rails 文档,可能使用 rake tmp:pids:clear
  • 将 tmp/pids 挂载到 tmpfs。 --mount type=tmpfs,destination=/home/rails/my-app/tmp/pids

Docker 文档中还有一个用于 Rails 应用程序的示例,它适用于第一个选项:https://docs.docker.com/samples/rails/

【讨论】:

    猜你喜欢
    • 2014-09-03
    • 2020-11-14
    • 1970-01-01
    • 2018-01-30
    • 2014-11-02
    • 1970-01-01
    • 1970-01-01
    • 2015-05-05
    • 2017-07-15
    相关资源
    最近更新 更多