Gitlab CI:从 Private Nexus 拉取 Docker 镜像

时间:2021-02-10 13:33:18

标签: docker gitlab gitlab-ci nexus

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

设置:

  • 在我的服务器上运行的 GitLab
  • 在 NAS 上运行的 Nexus
  • 我的笔记本电脑上的 GitLab-CI 运行器
  • 全部在本地网络上

Nexus 被配置为缓存来自 DockerHub 的 docker 图像并将它们存储在本地。这适用于裸机上的 docker。但是,当 CI 运行程序尝试拉取 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) 上的安装中使用,并且 sock 正在安装在 docker 容器中(配置如下)。这个 docker 实例已登录到 nexus 服务器,可以很好地拉取图像。 auths 配置包含在此 docker 安装的 config.json 中。

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'

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

"auths": {
    "synology:9042": {
      "auth": "Z3JhZGxlOmdyYWRsZQ=="
    }
}

其中 auth 是用户名和密码的 base64 编码(两者都是 gradle)。我也试过允许匿名访问 nexus,但也失败了。如果我将其指向 docker hub 但从图像名称中删除“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

我尝试过的其他事情:

  • 停止使用 osx 钥匙串获取凭据
  • 在安装 gitlab 的同一台机器上运行它
  • 确保每个 docker 实例都登录到 nexus
  • 从 CI 脚本显式登录

为了完成,这里是跑步者的 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

任何指针将不胜感激。

1 个答案:

答案 0 :(得分:1)

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

{
  "auths": {
    "synology:9042": {
      "auth": "Z3JhZGxlOmdyYWRsZQ=="
    }
  }
}
相关问题