使用 gitlab-ci 构建多个 Docker 镜像
Posted
技术标签:
【中文标题】使用 gitlab-ci 构建多个 Docker 镜像【英文标题】:Build multiple Docker images with gitlab-ci 【发布时间】:2021-12-29 14:31:06 【问题描述】:我正在尝试配置一个gitlab-ci.yml
文件来自动构建两个 Docker 映像。我已经看到它是使用 docker-compose 完成的,但就我而言,我不想使用 docker-compose。
我见过的docker-compose.yml
配置是这样的:
version: '3'
services:
vcxagency-base:
build:
context: https://github.com/AbsaOSS/vcxagencynode.git#master
dockerfile: ./vcxagency-base/vcxagency-base.Dockerfile
image: vcxagency-base:1.15.0
vcxagency-node:
build:
context: https://github.com/AbsaOSS/vcxagencynode.git#master
dockerfile: ./vcxagency-node/Dockerfile
image: vcxagency-node:0.3.1
ports:
- 8080:8080
depends_on:
- postgres
environment:
- LOG_LEVEL=debug
- LOG_ENABLE_INDYSDK=false
- LOG_JSON_TO_CONSOLE=false
- SERVER_PORT=8080
- SERVER_MAX_REQUEST_SIZE_KB=300
- SERVER_ENABLE_TLS=false
我根本没有真正使用过 Docker。我试图浏览文档,但找不到具体的内容。
目标是让这些在 Kubernetes 集群上运行,但现在我只想在 GitLab 中构建图像。
【问题讨论】:
您好!我在下面提供的答案是否可以帮助您解决最初的问题?如果是这样,您可能想接受它,以帮助其他在管道中遇到类似问题的人。如果帖子没有回答您的问题,也许可以提供更多信息 【参考方案1】:您可以使用 Kaniko 作为 docker 构建工具和称为矩阵构建的 GitLabs 功能。
如何使用 kaniko 构建 docker 镜像
以下片段摘自官方 GitLab docs
build:
stage: build
image:
name: gcr.io/kaniko-project/executor:debug
entrypoint: [""]
script:
- mkdir -p /kaniko/.docker
- echo "\"auths\":\"$CI_REGISTRY\":\"auth\":\"$(printf "%s:%s" "$CI_REGISTRY_USER" "$CI_REGISTRY_PASSWORD" | base64 | tr -d '\n')\"" > /kaniko/.docker/config.json
- >-
/kaniko/executor
--context "$CI_PROJECT_DIR"
--dockerfile "$CI_PROJECT_DIR/Dockerfile"
--destination "$CI_REGISTRY_IMAGE:$CI_COMMIT_TAG"
rules:
- if: $CI_COMMIT_TAG
什么是矩阵构建?
GitLab 引入了一项称为矩阵作业的并行作业执行功能,基本上该作业使用不同的变量集(可变矩阵)执行多次。
以上面的 sn-p 为基础,您将得到如下结果(假设您的 dockerfile 存储在 <PROJECT_DIR>/dockerfiles/
下,并分别命名为 A.dockerfile
和 B.dockerfile
):
.kaniko-build:
stage: build
image:
name: gcr.io/kaniko-project/executor:debug
entrypoint: [""]
script:
- mkdir -p /kaniko/.docker
- echo "\"auths\":\"$CI_REGISTRY\":\"auth\":\"$(printf "%s:%s" "$CI_REGISTRY_USER" "$CI_REGISTRY_PASSWORD" | base64 | tr -d '\n')\"" > /kaniko/.docker/config.json
- >-
/kaniko/executor
--context "$CI_PROJECT_DIR"
--dockerfile "$CI_PROJECT_DIR/$DOCKERFILE"
--destination "$CI_REGISTRY_IMAGE:$CI_COMMIT_TAG"
rules:
- if: $CI_COMMIT_TAG
docker-build:
extends: .build
parallel:
matrix:
- DOCKERFILE: $CI_PROJECT_DIR/dockerfiles/A.dockerfile
- DOCKERFILE: $CI_PROJECT_DIR/dockerfiles/B.dockerfile
【讨论】:
这是要走的路。我简化了 doc 中的示例并变成了可克隆的 repo:how-to.dev/how-to-build-docker-images-in-gitlab-ci以上是关于使用 gitlab-ci 构建多个 Docker 镜像的主要内容,如果未能解决你的问题,请参考以下文章
gitlab-ci docker-in-docker 访问不安全的注册表
Gitlab+Gitlab-CI+Docker实现持续集成(CI)与持续部署(CD)
使用 gitlab-ci.yml 的 Docker 内部的 Docker