使用单个 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
在拉入的部署机器上多个图像。可能不是最优雅的处理方式,但它确实有效。
我有一个包含两个微服务(命令和查询)及其相关 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
在拉入的部署机器上多个图像。可能不是最优雅的处理方式,但它确实有效。