【发布时间】:2021-01-29 00:36:29
【问题描述】:
我最近设置了 GitLab (13.4.3-ee) CI/CD 来构建和部署 Docker 容器投入生产。这很好用,但我想添加一个分期 一步,尽管阅读了一堆,我似乎无法找到一个可行的 这样做的方法。
我认为我遇到的一个问题是遵循教程,我依赖于 docker-compose 文件部署到生产环境中。
如果我添加了部署到不同(暂存)运行器的步骤,那么 image:
我在生产中使用的语句没有用,因为它安装了latest
图片。我真的不想在 docker 映像上使用 latest 标签,除非我是
即将将该映像部署到生产环境中。
我考虑将部署阶段的 docker-compose 命令替换为 重现撰写文件的一系列手动步骤,但这看起来很混乱, 尤其是当应用依赖于其他容器时。
关于我应该如何处理这个问题有什么建议吗?
.gitlab-ci.yml
stages:
- build
- deploy
# Build and tag :master and :latest images if on master branch
build-master:
# Official docker image.
image: docker:19.03.12-dind
stage: build
services:
- docker:19.03.12-dind
before_script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
script:
- echo $CI_REGISTRY_IMAGE
- docker build --pull -t $CI_REGISTRY_IMAGE:latest .
- docker push $CI_REGISTRY_IMAGE
# Only run this job on the master branch.
only:
- master
build-test:
# Official docker image.
image: docker:19.03.12-dind
stage: build
services:
- docker:19.03.12-dind
before_script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
script:
- echo $CI_REGISTRY_IMAGE
- docker build --pull -t $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_NAME .
- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_NAME
# Do not run job on master branch
except:
- master
deploy_prod:
stage: deploy
# Specify runner
tags:
- prod
before_script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
script:
# In production, pull the latest image.
- docker pull $CI_REGISTRY_IMAGE:latest
- docker-compose down
- docker-compose up -d
when: manual
only:
- master
docker-compose.yml
请注意,这是实际 docker-compose 文件的精简版。
---
version: '3'
services:
buildit:
image: my-gitlab-registry.local:5050/app/docker-build-test:latest
container_name: docker-build-test
ports:
- 500:80
【问题讨论】:
-
您可能根本不想使用
latest标签。为每个构建创建一个唯一的版本标签,并将其(可能通过环境变量)注入docker-compose.yml文件。这避免了系统认为它是最新的问题,因为它正在运行一些“最新”构建,即使它是昨天的“最新”。
标签: docker docker-compose gitlab gitlab-ci