Gitlab CI:从 Private Nexus 拉取 Docker 图像

Gitlab CI: pull Docker images from Private Nexus

我在使用缓存的 docker 图像在我的本地网络上设置 Gitlab CI 时遇到了一些问题。

设置:

Nexus 配置为从 DockerHub 缓存 docker 图像并将它们存储在本地。这适用于 docker 在裸机上。但是,当 CI runner 尝试拉取 docker 图像时,它会被以下消息阻止。

Using Docker executor with image synology:9042/library/gradle:alpine ...
Pulling docker image synology:9042/library/gradle:alpine ...
WARNING: Failed to pull image with policy "always": Error response from daemon: Head http://synology:9042/v2/library/gradle/manifests/alpine: no basic auth credentials (manager.go:205:0s)
ERROR: Preparation failed: failed to pull image "synology:9042/library/gradle:alpine" with specified policies [always]: Error response from daemon: Head http://synology:9042/v2/library/gradle/manifests/alpine: no basic auth credentials (manager.go:205:0s)

据我了解,docker 在我的笔记本电脑 (MacOs) 上的安装中被使用,袜子被安装在 docker 容器中(配置如下)。此 docker 实例已登录到 Nexus 服务器,可以正常拉取图像。此 docker 安装的 config.json 中包含 auths 配置。

version: '2.3'

services:
    GitlabRunner:
        image: gitlab/gitlab-runner:alpine-v13.9.0-rc1
        volumes:
         - /Users/<snip>/gitlab-runner/config:/etc/gitlab-runner
         - /var/run/docker.sock:/var/run/docker.sock
        restart: always
        networks:
          - 'default'

networks:
  default:
    driver: 'bridge'

以下信息 and here 我在 GitLab Runner 中设置了一个名为 DOCKER_AUTH_CONFIG 的变量,其内容为

"auths": {
    "synology:9042": {
      "auth": "<BASIC_AUTH_HERE>"
    }
}

其中 auth 是用户名和密码的 base64 编码(gradle)。我也试过在 nexus 上允许匿名访问,但也失败了。如果我将 CI 指向 docker 集线器但从图像名称中删除 'synology:9042/',则 CI 工作正常。

image: synology:9042/library/gradle:alpine

variables:
  GRADLE_OPTS: "-Dorg.gradle.daemon=false"

before_script:
  - export GRADLE_USER_HOME=`pwd`/.gradle

build:
  stage: build
  script: gradle --build-cache assemble
  cache:
    key: "$CI_COMMIT_REF_NAME"
    policy: push
    paths:
      - build
      - .gradle
  tags:
    - test

我尝试过的其他事情:

为了完成,这里是运行器的 TOML 配置

concurrent = 4
check_interval = 10
log_level = "info"

[session_server]
  session_timeout = 1800

[[runners]]
  name = "test"
  url = "http://my.gitlab.server:port/"
  token = "tYsvSq7jSwvNYyMhj7fU"
  executor = "docker"
  [runners.custom_build_dir]
  [runners.cache]
    [runners.cache.s3]
    [runners.cache.gcs]
    [runners.cache.azure]
  [runners.docker]
    tls_verify = false
    image = "synology:9042/library/gradle:alpine"
    privileged = false
    disable_entrypoint_overwrite = false
    oom_kill_disable = false
    disable_cache = false
    volumes = ["/cache"]
    shm_size = 0

任何指点将不胜感激。

这有点愚蠢,我遗漏了 auth 块周围的外括号:

{
  "auths": {
    "synology:9042": {
      "auth": "<BASIC_AUTH_HERE>"
    }
  }
}