Gitlab 的 CI docker in docker login and test containers



我有一个项目需要运行TestContainers来执行end2end测试。Containers的镜像是另一个docker镜像被推送到GitLab的Container Registry的项目。这意味着,每当我想对这个图像进行docker提取时,我都需要首先进行docker登录。

在本地,它工作得很好,我只需登录,运行测试,一切都很好……管道上的情况就另当别论了。

在GitLab的文档中,在管道的配置文件.gitlab-ci.yml上,他们使用image: docker:19.03.12。问题是我需要运行./gradlew,并且说镜像没有java可以运行。否则,如果我将映像设置为image: gradle:jdk14,即使我设置了DockerInDocker,当我运行docker login时,它也会说docker不被识别为命令。

我尝试用Docker和Java14创建一个自定义图像,但仍然得到以下错误:

com.github.dockerjava.api.exception.NotFoundException: {"message":"pull access denied for registry.gitlab.com/projects/projecta, repository does not exist or may require 'docker login': denied: requested access to the resource is denied"}

正如你在gitlab ci文件中看到的,它在执行测试之前运行docker登录,根据管道的输出是成功的

.gitlab-ci.yml

image: gradle:jdk14
variables:
GRADLE_OPTS: "-Dorg.gradle.daemon=false"
stages:
- build
- test
before_script:
- export GRADLE_USER_HOME=`pwd`/.gradle
assemble:
stage: build
script:
- ./gradlew assemble
only:
changes:
- "**/*.gradle.kts"
- gradle.properties
cache:
key: $CI_PROJECT_NAME
paths:
- .gradle/wrapper
- .gradle/caches
policy: push
cache:
key: $CI_PROJECT_NAME
paths:
- .gradle/wrapper
- .gradle/caches
policy: pull
test:
stage: test
image: registry.gitlab.com/project/docker-jdk14:latest #<-- my custom image
dependencies:
- checkstyle
services:
- docker:dind
variables:
DOCKER_HOST: "tcp://docker:2375"
DOCKER_DRIVER: overlay2
DOCKER_TLS_CERTDIR: ""
script:
- docker login -u $CI_DEPLOY_USER -p $CI_DEPLOY_PASSWORD $CI_REGISTRY
- ./gradlew test

我有一种感觉,我错过了一些东西,但到目前为止,我能想到的唯一解释是,管道正在执行的docker login没有将凭据设置为内部docker实例。

是否有调用内部实例而不是外部实例中的登录名的方法?

我想过在测试中进行登录调用。。但那将是我最后的选择。

如果我正确阅读了您的问题,那么您正在尝试为项目gitlab.com/projects/projectb运行CI,该项目在测试期间使用项目gitlab.com/projects/projecta中构建的映像。

您正试图使用预定义变量$CI_DEPLOY_USER$CI_DEPLOY_PASSWORD中的用户名和密码提取图像registry.gitlab.com/projects/projecta

它不起作用,因为该用户只有访问gitlab.com/projects/projectb的权限。您需要做的是为项目gitlab.com/projects/projecta创建具有访问注册表权限的部署令牌,通过自定义变量将其提供给gitlab.com/projects/projectb中的CI,并使用这些变量登录到$CI_REGISTRY

最新更新