【发布时间】: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 应用程序有推荐的设置?
【问题讨论】:
-
您可以通过在重新启动 rails 之前删除以前的 rails server pid (id any) 来解决:
command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'",参考:github.com/docker/compose/issues/1393
标签: ruby-on-rails docker deployment vps production