GitLab CI从私有注册表中提取docker



情况

我目前正在进行一个项目,将CI环境从Jenkins迁移到GitLab CI。为了让一切正常工作,我构建了一些docker容器,这些容器应该作为CI管道的基本映像。这些容器不能存储在GitLab内部容器注册表中,应该推送到Artifactory实例中。

我已经做过的/尝试过的

到目前为止,我通过使用Kaniko进行Docker构建来完成所有工作,并将生成的图像正确地推送到artifactory注册表中——到目前为止一切都很好。

然而,我现在已经到了一个地步,我有了CI作业,它应该使用以前构建的容器映像作为它们的基本映像,所以它们应该从artifactory实例中提取,该实例用作私有注册表。

示例配置

.docker-build-abstract:
image: custom.kaniko.fork.from.internal.gitlab-registry:<tag>
script:
- |>
echo "build container with image tag: ${IMAGE_TAG}"
# kaniko default build..
# This job builds an image that is pushed to private registry.
docker-build-1:
stage: "build"
variables:
IMAGE_TAG: some.nice.tag
BUILD_ARGS: --build-arg foo=bar --build-arg bar=baz
extends:
- .docker-build-abstract
# This job should make use of the previously built image
other-job-1:
stage: "build"
image: docker.from.docker-build-1:<tag>
script: #...

这样做的问题是,我无法在官方文档中提出的CI设置中使用DOCKER_AUTH_CONFIG变量。这是因为(我的理解(当在项目设置中提供此变量时,这将覆盖默认注册表设置(CI_REGISTRYCI_REGISTRY_USERCI_REGISTRY_PASSWORD(,但我需要保留这些内部变量后面的值,因为最初的一些作业使用的是仅存在于该私有gitlab实例中的容器映像。

是否可以在CI/CD变量设置中提供多个身份验证配置?既然这对保持内部注册表的知名度很重要,我该如何引用这里的预定义变量?

我可以想象下面的内容(这是kaniko预配置的一部分(,但无法为这种情况找到可能的解决方案。

{
"auths": {
"$PRIVATE_REGISTRY": {
"username": "$PRIV_REGISTRY_USER",
"password": "$PRIV_REGISTRY_API_KEY",
"email": "$PRIV_REGISTRY_USER_EMAIL"
},
"$CI_REGISTRY": {
"username": "$CI_REGISTRY_USER",
"password": "$CI_REGISTRY_PASSWORD"
}
}
}

据我所知,ci配置中的变量可以被覆盖,但这对我来说不起作用。这是否需要对ci runner进行高级配置才能实现所需的行为,如文档中所述?

非常感谢您的帮助或提示!

可以为此使用DOCKER_AUTH_CONFIG。配置可以支持多个注册表。因此,可以为您的GitLab内部注册表和JFrog Artifactory实例都设置此设置。请参阅docker文档中的凭据助手,该文档支持多个注册表。

或者,您可以根据需要在工作中使用docker login,它将动态地将身份验证信息应用于(docker(配置。

my_job:
before_script:
# authenticate to pull from GitLab registry
# https://docs.gitlab.com/ee/ci/variables/predefined_variables.html
- docker login $CI_REGISTRY -u $CI_REGISTRY_USER -p $CI_JOB_TOKEN

# authenticate to pull from Artifactory
# you must define these variables
- docker login $ARTIFACTORY_REGISTRY -u $ARTIFACTORY_USER -p $ARTIFACTORY_PASSWORD

您也可以使用两者的组合——例如,DOCKER_AUTH_CONFIG用于artifactory,docker login用于GitLab注册表。

或者,你也可以配置JFrog Artifactory虚拟repo,它将提供来自GitLab注册表的图像。这样,您只需要在作业端配置一个注册表。但是,这需要提前设置,并且可能涉及授权。

实际上,您可以在"auths";第节。这对我们来说确实很好。但我认为通过在CI管道中设置DOCKER_AUTH_CONFIG不会起作用。我想我们试过一次,但没有成功。我们通过设置环境变量在Runner配置中对其进行配置。

如果不能做到这一点,另一个解决方案是在CI管道中运行docker login命令,例如在before_script部分。

最新更新