Gitlab 的 CI docker in docker 登录和测试容器
Gitlab's CI docker in docker login and test containers
我有一个项目需要 TestContainers 运行 执行端到端测试。
Containers 的图像是另一个项目,docker 图像被推送到 GitLab 的 Container Registry。这意味着,每当我想 docker 拉取此图像时,我需要先进行 docker 登录。
在本地它工作正常,我只是登录,运行 我的测试一切正常.. 在管道上是另一个故事。
在 GitLab's documentation 中,在管道的配置文件 .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登录,根据pipeline的输出是成功的
.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实例.
有没有办法在内部实例而不是外部实例中调用登录?
我考虑过在测试中进行登录调用..但那将是我最后的选择。
如果我没看错你的问题,你正在尝试 运行 CI 项目 gitlab.com/projects/projectb
,它在测试期间使用项目 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
.
我有一个项目需要 TestContainers 运行 执行端到端测试。 Containers 的图像是另一个项目,docker 图像被推送到 GitLab 的 Container Registry。这意味着,每当我想 docker 拉取此图像时,我需要先进行 docker 登录。
在本地它工作正常,我只是登录,运行 我的测试一切正常.. 在管道上是另一个故事。
在 GitLab's documentation 中,在管道的配置文件 .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登录,根据pipeline的输出是成功的
.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实例.
有没有办法在内部实例而不是外部实例中调用登录?
我考虑过在测试中进行登录调用..但那将是我最后的选择。
如果我没看错你的问题,你正在尝试 运行 CI 项目 gitlab.com/projects/projectb
,它在测试期间使用项目 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
.