如何解决GitLab CD工作流程将Docker应用程序部署到登台和生产中
我最近设置了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
解决方法
您可以使用环境变量来选择图像标签。在您的docker-compose中,您可以这样做
---
version: '3'
services:
buildit:
image: my-gitlab-registry.local:5050/app/docker-build-test:${IMAGE_TAG:-latest} #latest is a default value
container_name: docker-build-test
ports:
- 500:80
和gitlab-ci
- 在
build_master
期间,您可以推送许多标签 - 在
deploy_prod
期间,您可以设置IMAGE_TAG = master - 在
deploy_staging
期间,您可以设置IMAGE_TAG =登台
....
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
- docker push $CI_REGISTRY_IMAGE:master # tag master
- docker push $CI_REGISTRY_IMAGE:staging # tag staging
# Only run this job on the master branch.
only:
- 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.
- export IMAGE_TAG=master
- docker pull $CI_REGISTRY_IMAGE:latest
- docker-compose down
- docker-compose up -d
when: manual
only:
- master
deploy_staging:
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.
- export IMAGE_TAG=staging
- docker pull $CI_REGISTRY_IMAGE:latest
- docker-compose down
- docker-compose up -d
when: manual
only:
- master
通过这种方式,您可以避免拉出latest
图像,并且可以将特定图像上的最新图像拉出
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。