我想我有一个鸡和蛋的情况:
我的 Rails 应用程序是基于 Docker 的,我有几个用于 nginx、Rails、Resque worker、Redis 和 MySQL 的镜像。
我目前的部署实现是(简单地说):
docker-compose build
docker-compose down
... compile assets
... migrate
docker-compose up
效果很好,但当然,如果我在部署期间浏览应用程序,我不会做出任何用户体验不佳的响应。
我知道在 nginx 中设置一个“维护”页面,该页面在站点处于维护模式时提供服务,但 nginx 图像是 docker-compose 规范的一部分,因此它也会下降。
将所有图像都放在一个 docker-compose 规范中确实使部署更容易——如果任何图像(包括 nginx)发生任何变化,都会自动部署。尤其是因为 nginx、Rails、MySQL 等都在同一个网络中。
如果 nginx 是 docker-compose 规范的一部分,我怎么能在应用程序重新部署时继续提供维护页面?
(如果它有所作为,我将在主机上使用 gitlab 和 gitlab-runner 容器从 repo 进行部署。)
谢谢
最佳答案
这是一个:
docker-compose 的 NGINX 维护页面示例
只需将 nginx 保存在同一个 docker-compose.yml 中的单独容器中,并按如下方式部署:
docker-compose up -d --build --force-recreate your-app-service
添加一些逻辑,将维护页面放在 nginx 中。 nginx 服务不会被 compose 触及。
使用这样的东西来启用维护站点:
您的 nginx config :
upstream backend {
server app:80;
server maintenance:80 backup; # <-- note the backup flag
}
server {
location / {
proxy_pass http://backend;
proxy_connect_timeout 1s;
}
}
然后在你的 docker-compose.yml 中:
version: "3"
services:
app:
(...)
nginx:
(...)
maintenance:
image: nginx
volumes:
- ./maintenance.html:/usr/share/nginx/html/index.hml
- ./maintenance.conf:/etc/nginx/conf.d/default.conf
维护配置文件
server {
root /usr/share/nginx/html;
server {
listen 8080;
location / {
rewrite ^ /index.html break;
}
}
}
我在这里有一个完整的工作示例:https://github.com/xbx/docker-compose-nginx-maintenance-page-example
关于ruby-on-rails - 基于 Docker 的 Rails 应用程序的 nginx 维护页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45021826/