在某个流水线中登录私有HTTP仓库,一直提示: server gave HTTP response to HTTPS client
Run docker login -u *** -p *** 10.4.88.88:5000
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Error response from daemon: login attempt to 10.4.96.17:5000 failed with status: authenticating creds for "10.4.96.17:5000": pinging container registry 10.4.96.17:5000: Get "https://10.4.96.17:5000/v2/";: http: server gave HTTP response to HTTPS client
1. 在基础镜像中配制信用HTTP仓库也不行:
# 信任 HTTP 镜像仓库(Docker daemon 配置)
RUN mkdir -p /etc/docker && \
printf '{\n "insecure-registries": ["10.4.96.17:5000"]\n}\n' > /etc/docker/daemon.json
# 信任 HTTP 镜像仓库(Podman registries 配置)
RUN mkdir -p /etc/containers && \
printf '[[registry]]\nlocation = "10.4.96.17:5000"\ninsecure = true\n' > /etc/containers/registries.conf
2. 关键信息:
level=info,这是 Docker CLI 自己 打的日志,不是 daemon 返回的错误。说明 Docker CLI 29.x 在 docker login 时会自己先 ping 一下仓库,根本不经过 daemon!┌──────────────┐ HTTPS ping ┌─────────────┐
│ Docker CLI │ ──────────────────→ │ Zot (HTTP) │ ← CLI 自己连,失败了!
│ (容器内) │ HTTP 响应 400 │ │
└──────────────┘ └─────────────┘
无论宿主机怎么配,docker login 命令都绕不过去,因为 Docker CLI 29.x 自带仓库探测逻辑,直接走 HTTPS。
所以手动写 config.json 是唯一正确方案。请 Accept 刚才的 diff,把 docker login 替换为手动写 auth 文件。
# 1. 先确认 HTTP 直连仓库是通的
curl -v http://10.4.96.17:5000/v2/
# 2. 手动生成 config.json(模拟我们改流水线后的效果)
AUTH=$(printf 'user-dev:你的密码' | base64 -w 0)
mkdir -p /root/.docker
printf '{"auths":{"10.4.96.17:5000":{"auth":"%s"}}}' "${AUTH}" > /root/.docker/config.json
# 3. 验证 config.json 写对了
cat /root/.docker/config.json
# 4. 尝试 pull 一个镜像(验证整个链路是否通)
docker pull 10.4.96.88:5000/builder-base:v2.4
验证通过,把第2步,集成进CI/CD即可。
回复 (0)
-
#
微信扫码 立即评论
