docker - Gitlab 在 docker login 和 test 容器中的 CI docker
问题描述
我有一个项目需要运行 TestContainers 来执行端到端测试。Containers 的镜像是另一个将 docker 镜像推送到 GitLab 的 Container Registry 的项目。这意味着,每当我想对该图像进行 docker pull 时,我都需要先进行 docker login。
在本地它工作得很好,我只是登录,运行我的测试,一切都很好..管道上是另一回事。
在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 login ,并且根据管道的输出是成功的
.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 实例。
无论如何在内部实例而不是外部实例中调用登录?
我考虑过在测试中进行登录调用。但那将是我的最后选择。
解决方案
如果我正确阅读了您的问题,您正在尝试为 project 运行 CI ,它在测试期间gitlab.com/projects/projectb
使用项目中内置的图像。gitlab.com/projects/projecta
您正在尝试registry.gitlab.com/projects/projecta
使用预定义变量中的用户名和密码提取图像,$CI_DEPLOY_USER
并且$CI_DEPLOY_PASSWORD
.
它不起作用,因为该用户只有访问权限gitlab.com/projects/projectb
。您需要做的是为gitlab.com/projects/projecta
具有访问注册表权限的项目创建部署令牌,gitlab.com/projects/projectb
通过自定义变量将其提供给您的 CI 并使用这些变量登录到$CI_REGISTRY
.
推荐阅读
- c# - 检测左键单击 DataGridView 标题时是否按下了 CTRL 键
- excel - 获取模式计数
- python - 我的 python praw 脚本抛出 404 错误?
- python - 如何在 Django 更新语句中将字段设置为空
- c - C - 使用 lseek 移回文件中的指针
- virtual-machine - rbvmomi 能否使用类似于 Invoke-VMScript 脚本的 VM Tools
- cron - 如何定义 Quartz 2 的 Cron 表达式
- javascript - 能够将不同的参数签名作为函数参数传递
- html - 使用多个查询并呈现为 HTML
- powershell - 我需要运行一个脚本,它将返回给我 AD 中任何大写首字母的 sAMAccountname