Ruby on rails 基于Docker的Rails应用程序的nginx维护页面

Ruby on rails 基于Docker的Rails应用程序的nginx维护页面,ruby-on-rails,nginx,docker,docker-compose,continuous-deployment,Ruby On Rails,Nginx,Docker,Docker Compose,Continuous Deployment,我想我有一个鸡和蛋的情况: 我的Rails应用程序是基于Docker的,我有几个用于nginx、Rails、Resque worker、Redis和MySQL的图像 我当前的部署实现是(简单地说): 这很好,但当然,如果我在部署期间浏览应用程序,我不会做出任何不利于用户体验的响应 我知道在nginx中设置了一个“维护”页面,该页面在站点处于维护模式时提供,但nginx图像是docker compose规范的一部分,因此也会下降 将所有图像放在一个docker compose规范中确实会使部署更容

我想我有一个鸡和蛋的情况:

我的Rails应用程序是基于Docker的,我有几个用于nginx、Rails、Resque worker、Redis和MySQL的图像

我当前的部署实现是(简单地说):

这很好,但当然,如果我在部署期间浏览应用程序,我不会做出任何不利于用户体验的响应

我知道在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。compose不会触及nginx服务


使用类似的方法启用维护站点:

你的:

maintenance.conf

server {
    root /usr/share/nginx/html;
    server {
        listen 8080;

        location / {
            rewrite ^ /index.html break;
        }
    }
}
我这里有一个完整的工作示例:

备用工作流:使用。这样,您就可以执行以下工作流:

docker swarm init
docker swarm deploy -c mycomposefile.yml
docker-compose build
docker service update ...

这样,您就不必关闭服务,swarm模式会为您更新服务。

在您的示例中,
nginx
服务是否因为包含Rails资产而被重新部署?如果您只是重建资产,然后执行
docker compose up
(no
down
)它是否仍然重新启动
nginx
服务?@AndyShinn-实际上它不包含资产,它共享包含资产的卷。嗯,好的,如果我没有关闭
docker compose
,那么nginx不会重新启动(我得到了坏网关,但这是预期的,因为应用程序容器已关闭)。好的,我将尝试在部署周围启用维护页面,而不是关闭所有容器…@SteveFolly,我已经更新了答案。此外,我还提供了一个完整的例子,我喜欢这个,而不是“触摸文件进入维护模式”,这可能会失去同步。这只是检查后端是否正在运行,并相应地重定向。或者两者兼而有之——这会让我在后端仍在运行的情况下强制维护模式?此逻辑有1秒的延迟,以便“意识到”后端是否在运行。所以假阳性可能持续1秒。
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;
        }
    }
}
docker swarm init
docker swarm deploy -c mycomposefile.yml
docker-compose build
docker service update ...