Gitlab CI:从 Private Nexus 拉取 Docker 图像
Gitlab CI: pull Docker images from Private Nexus
我在使用缓存的 docker 图像在我的本地网络上设置 Gitlab CI 时遇到了一些问题。
设置:
- 我服务器上的 GitLab 运行
- Nexus 运行 在 NAS 上
- 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
我尝试过的其他事情:
- 停止使用 osx 钥匙串作为凭据
- 运行 和gitlab install在同一台机器上
- 确保每个 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
任何指点将不胜感激。
这有点愚蠢,我遗漏了 auth 块周围的外括号:
{
"auths": {
"synology:9042": {
"auth": "<BASIC_AUTH_HERE>"
}
}
}
我在使用缓存的 docker 图像在我的本地网络上设置 Gitlab CI 时遇到了一些问题。
设置:
- 我服务器上的 GitLab 运行
- Nexus 运行 在 NAS 上
- 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'
以下信息
"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
我尝试过的其他事情:
- 停止使用 osx 钥匙串作为凭据
- 运行 和gitlab install在同一台机器上
- 确保每个 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
任何指点将不胜感激。
这有点愚蠢,我遗漏了 auth 块周围的外括号:
{
"auths": {
"synology:9042": {
"auth": "<BASIC_AUTH_HERE>"
}
}
}