GitLab CD工作流程将Docker应用程序部署到登台和生产中

时间:2020-10-14 14:59:04

标签: docker docker-compose gitlab gitlab-ci

我最近设置了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

1 个答案:

答案 0 :(得分:0)

您可以使用环境变量来选择图像标签。在您的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图像,并且可以将特定图像上的最新图像拉出