让Docker在Gitea CI/CD流水线中登录http仓库:手写Docker认证信息


发布者 ourjs  发布时间 1783497491981
关键字 云原生  devops 
在某个流水线中登录私有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即可。

 









  开源的 OurJS
OurJS开源博客已经迁移到 OnceOA 平台。

  关注我们
扫一扫即可关注我们:
OnceJS

OnceOA