我认为我有鸡蛋和鸡蛋的情况:
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进行部署。)
由于
答案 0 :(得分:2)
这是:
将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模式会为您更新服务。