Первый файл, это buildx-common.hcl, определят общие настройки, задает группы.
# Base variables
variable "CI_REGISTRY_IMAGE" { default = "registry/nginx:master-latest" }
variable "CI_COMMIT_REF_SLUG" { default = "dev-local" }
variable "CI_COMMIT_SHORT_SHA" { default = "00000000" }
variable "CI_PIPELINE_IID" { default = "00000" }
variable "IMG_SEMVER" { default = "v0.0.1" }
variable "CI_DEFAULT_BRANCH" { default = "main" }
# Secrets
variable "NPM_REPO_TOKEN" { default = "job_token" }
# Docker images variables
IMAGE_TAG = "${CI_COMMIT_REF_SLUG}-${CI_PIPELINE_IID}"
IMAGE_TAG_LATEST = "${CI_COMMIT_REF_SLUG}-latest"
IMG_TAGS = (
"${CI_COMMIT_REF_SLUG}" == "${CI_DEFAULT_BRANCH}"
? [
"${CI_REGISTRY_IMAGE}/nginx:${IMAGE_TAG}",
"${CI_REGISTRY_IMAGE}/nginx:${IMAGE_TAG_LATEST}",
"${CI_REGISTRY_IMAGE}/nginx:${IMG_SEMVER}"
]
: [
"${CI_REGISTRY_IMAGE}/nginx:${IMAGE_TAG}",
"${CI_REGISTRY_IMAGE}/nginx:${IMAGE_TAG_LATEST}",
"${CI_REGISTRY_IMAGE}/nginx:${IMG_SEMVER}-${CI_COMMIT_REF_SLUG}"
]
)
group "default" {
targets = ["nginx"]
}
Тут можно использовать тернарный оператор для более гибкого управления тегированием, если это конечно нужно в проекте.
Основной файл buildx-nginx.hcl:
target "default" {
context="."
dockerfile=".ops/docker/nginx.Dockerfile"
pull = true
secret = [
"id=npm_repo_token,src=${NPM_REPO_TOKEN}"
]
args = {
BUILDKIT_INLINE_CACHE = "1"
}
output = ["type=registry"]
}
target "nginx" {
inherits = ["default"]
target = "nginx"
tags = "${IMG_TAGS}"
cache-from = [
"${CI_REGISTRY_IMAGE}/nginx:${IMAGE_TAG_LATEST}",
"${CI_REGISTRY_IMAGE}/nginx:master-latest"
]
}target nginx внутри этого файла соответствует targets из group default основного файла. Таргетов и групп может быть разное кол-во, это позволяет удобно управлять сборкой.
cache-from - получает кэш из указанных образов.
secret - используется для "монитрования" сикретов в Dockerfile. Подробнее об этом в официальной документации.
Сама сборка с помощью bake:
docker buildx bake --file $BUILDX_COMMON_FILE --file $BUILDX_FILE $target
В gitlab-ci $targets можно передать список значений через пробел:
build:nginx:
stage: build
variables:
BUILDX_COMMON_FILE: "buildx-common.hcl"
BUILDX_FILE: "buildx-nginx.hcl"
TARGETS: default
#gitlab
#ci