使用单个 gitlab-ci.yml 将多个 docker 图像部署到 VPS

Deploy multiple docker images with a single gitlab-ci.yml to a VPS

我有一个包含两个微服务(命令和查询)及其相关 Dockerfile 的存储库:

├── command
│   ├── DockerFile
│   ├── main.py
│   ├── requirements.txt
│   └── server
│       ├── app.py
│       ├── env.py
│       ├── logger.py
├── docker-compose.yaml
└── query
    ├── DockerFile
    ├── main.py
    ├── requirements.txt
    └── server
        ├── app.py
        ├── database.py
        ├── env.py

我在 VPS 中有一个 gitlab runner,在另一个 VPS 中我部署了服务。 我想使用 gitlab-ci 分别部署这两个微服务。以下是我只有一张图片时通常的做法:

stages:
  - publish
  - deploy

variables:
  TAG_LATEST: $CI_REGISTRY_IMAGE/$CI_COMMIT_REF_NAME:latest
  TAG_COMMIT: $CI_REGISTRY_IMAGE/$CI_COMMIT_REF_NAME:$CI_COMMIT_SHORT_SHA

publish:
  image: docker:latest
  stage: publish
  services:
    - docker:19.03-dind
  script:
    - docker build -t $TAG_COMMIT -t $TAG_LATEST .
    - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY
    - docker push $TAG_COMMIT
    - docker push $TAG_LATEST

deploy:
  image: alpine:latest
  stage: deploy
  tags:
    - deployment
  script:
    - chmod og= $ID_RSA
    - apk update && apk add openssh-client
    - ssh -i $ID_RSA -o StrictHostKeyChecking=no $SERVER_USER@$SERVER_IP "docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY"
    - ssh -i $ID_RSA -o StrictHostKeyChecking=no $SERVER_USER@$SERVER_IP "docker pull $TAG_COMMIT"
    - ssh -i $ID_RSA -o StrictHostKeyChecking=no $SERVER_USER@$SERVER_IP "docker container rm -f my-app || true"
    - ssh -i $ID_RSA -o StrictHostKeyChecking=no $SERVER_USER@$SERVER_IP "docker run -d -p $INTERNAL_SERVER_IP:80:80 --name my-app $TAG_COMMIT"

有 2 个图像时的问题是构建阶段将为整个存储库创建一个图像。是否可以为每项服务单独进行? 我可以在部署服务器上使用 docker-compose 吗?

您可以创建两组作业(发布-查询、发布-命令),每组作业构建并推送两个 docker 图像。如果他们不依赖彼此,他们甚至会根据跑步者同时建造。他们会有相同的阶段(publish 在你的情况下)。

同样,您可以创建两个部署作业(部署查询、部署命令)来执行每个部署。都在deploy阶段。

我没有在构建服务器上使用 docker-compose,但是我已经创建了图像,将它们推送上去,然后 运行 docker-compose 在拉入的部署机器上多个图像。可能不是最优雅的处理方式,但它确实有效。