基于Docker的Rails应用程序

时间:2017-07-10 21:24:17

标签: ruby-on-rails nginx docker docker-compose continuous-deployment

我认为我有鸡蛋和鸡蛋的情况:

My 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进行部署。)

由于

2 个答案:

答案 0 :(得分:2)

这是:

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

maintenance.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

答案 1 :(得分:0)

备用工作流程:使用Docker swarm mode。这样您就可以执行以下工作流程:

>>> a=[1,2,3,4,5]
>>> b=[6,7,8,9,10]
>>> list(zip(a,b))
[(1, 6), (2, 7), (3, 8), (4, 9), (5, 10)]

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