流水线推送容器到本地非安全registry,修改daemon.json未生效如何解决?
你遇到的报错是Docker客户端默认要求所有registry交互走HTTPS协议,但你本地部署的registry仅提供HTTP服务,所以触发了http: server gave HTTP response to HTTPS client错误。
你之前直接写入daemon.json未生效的核心原因是修改Docker守护进程配置后必须重启Docker服务才会加载新配置,同时可能存在配置覆盖、执行上下文不对等额外问题。
第一步:正确配置
insecure-registries(避免覆盖原有配置)
如果你原有/etc/docker/daemon.json存在其他配置,直接echo覆盖会导致原有配置丢失,建议用jq命令合并配置:# 没有jq的话先安装:apt install jq / yum install jq jq '. + {"insecure-registries": [(.["insecure-registries"] // [])[], "<local_host_name>.local:32000"] | unique}' /etc/docker/daemon.json > /tmp/daemon.json && mv /tmp/daemon.json /etc/docker/daemon.json如果你确定没有原有配置,可以直接执行你原来的写入命令。
第二步:重启Docker守护进程加载配置
主流Systemd发行版执行如下命令:sudo systemctl daemon-reload sudo systemctl restart docker如果你用的是Docker Desktop,直接在客户端界面选择重启Docker即可。
第三步:验证配置是否生效
执行如下命令查看Docker生效配置:docker info | grep -A 5 "Insecure Registries"确认输出中包含你添加的
<local_host_name>.local:32000地址,说明配置已生效。第四步:排查特殊场景问题
如果上述操作后还是报错,检查你的流水线执行场景:如果你的流水线任务是在Docker容器内执行(即Docker-in-Docker DinD模式),需要确认你修改的是实际执行docker push命令的Docker实例的daemon.json,而不是外层宿主机的配置,修改后同样要重启对应Docker实例。
确认流水线agent可以正常解析<local_host_name>.local主机名到registry所在机器的IP,可在agent上执行ping <local_host_name>.local验证连通性。
内容的提问来源于stack exchange,提问作者Brad Vrabete

