Gitlab';s docker登录和测试容器中的CI docker

Gitlab';s docker登录和测试容器中的CI docker,docker,gradle,gitlab-ci,java-14,docker-in-docker,Docker,Gradle,Gitlab Ci,Java 14,Docker In Docker,我有一个项目需要运行TestContainers来执行end2end测试。 容器的映像是docker映像被推送到GitLab容器注册表的另一个项目。这意味着,每当我想做这个图像的docker拉,我需要做一个docker登录第一 在本地,它工作正常,我只需登录,运行测试,一切正常。。管道上还有另一个故事 在中,在管道的配置文件.gitlab ci.yml上,它们使用图像:docker:19.03.12。问题是,我需要运行/gradlew,并且说映像没有java可以运行。否则,如果我将映像设置为im

我有一个项目需要运行TestContainers来执行end2end测试。 容器的映像是docker映像被推送到GitLab容器注册表的另一个项目。这意味着,每当我想做这个图像的docker拉,我需要做一个docker登录第一

在本地,它工作正常,我只需登录,运行测试,一切正常。。管道上还有另一个故事

在中,在管道的配置文件
.gitlab ci.yml
上,它们使用
图像:docker:19.03.12
。问题是,我需要运行
/gradlew
,并且说映像没有java可以运行。否则,如果我将映像设置为
image:gradle:jdk14
,即使我设置了DockerDocker,当我运行
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
image:gradle:jdk14
变量:
GRADLE_选择:“-Dorg.GRADLE.daemon=false”
阶段:
-建造
-试验
在脚本之前:
-导出GRADLE\u USER\u HOME=`pwd`/.GRADLE
汇编:
阶段:建造
脚本:
-/gradlew组装
仅:
变化:
-“***.gradle.kts”
-格拉德尔酒店
隐藏物:
关键字:$CI_项目名称
路径:
-格雷德尔先生/包装工
-格雷德尔先生/缓存
政策:推动
隐藏物:
关键字:$CI_项目名称
路径:
-格雷德尔先生/包装工
-格雷德尔先生/缓存
政策:拉动
测试:
阶段:测试

image:registry.gitlab.com/project/docker-jdk14:latest#如果我正确地阅读了您的问题,那么您正在尝试为project
gitlab.com/projects/projectb
运行CI,它在测试期间使用内置于project
gitlab.com/projects/projecta

您正试图使用预定义变量
$CI\u DEPLOY\u USER
$CI\u DEPLOY\u password
中的用户名和密码来提取image
registry.gitlab.com/projects/projecta


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

,这实际上是一个很好的观察。我会试试,让你知道。非常感谢。非常感谢!:D