假设我在Gitlab上有一个代码库,以下是部署方案:
它在主机服务器重新启动之前工作得很好。但主机服务器重新启动后,只有
我找到的解决方法及其缺点如下:
- 在主机服务器上安装docker和gitlab-runner,并使用docker executor。
- 在
.gitlab-ci.yml
中设置docker-compose来构建和启动我的服务及其依赖项。 - 设置管道以通过将提交推送到
production
分支来触发。
docker-compose.yml
有两个服务:app
(具有restart:always
)和db
(没有重启规则)。app
依赖于db
,因此docker-compose up
会先启动db
,然后再启动app
。它在主机服务器重新启动之前工作得很好。但主机服务器重新启动后,只有
app
容器会重新启动。我找到的解决方法及其缺点如下:
- 将
restart: always
添加到db
服务中。但是app
可能会在db
之前启动,从而导致失败。 - 在主机上使用
docker-compose
并设置docker-compose up
自动运行。但在这种情况下,我应该设置docker-compose,在主机服务器上部署ssh密钥,在某个位置克隆代码并更新它。这似乎违反了DRY原则,并使方案过于复杂化。 - 在重新启动后触发流水线。我发现的唯一方法是通过API和触发器令牌来触发它。但在这种情况下,我必须设置触发器令牌,这似乎不像以前那样糟糕,但违反了DRY原则,并使方案过于复杂化。
如何改进部署方案以使docker在重启后以正确的顺序重新启动容器。
P.S. 配置如下:
.gitlab-ci.yml:
image:
name: docker/compose:latest
services:
- docker:dind
stages:
- deploy
deploy:
stage: deploy
only:
- production
script:
- docker image prune -f
- docker-compose build --no-cache
- docker-compose up -d
docker-compose.yml:
version: "3.8"
services:
app:
build: .
container_name: app
depends_on:
- db
ports:
- "80:80"
restart: always
db:
image: postgres
container_name: db
ports:
- "5432:5432"
docker stack deploy
而不是docker-compose up
。使用Docker Swarm,系统将自动工作以维护最初声明的状态,无需干预或特殊主机设置。理想情况下,你应该在群集中拥有多个主机,但从技术上讲并非必需。你也可以切换到k8s部署运行程序,但基本上你将从头开始。 - sytech