常规Docker Push正常但Buildx(docker-container)推送失败:导出镜像报错
问题解决:buildx推送本地HTTP镜像仓库失败
错误原因
常规Docker命令能正常推送是因为你已经在Docker daemon配置中把本地仓库设为不安全注册表(允许HTTP访问),但buildx使用的docker-container驱动运行在独立容器中,不会继承本地daemon的不安全注册表配置,默认强制使用HTTPS访问仓库,导致出现http: server gave HTTP response to HTTPS client错误。
解决方案
方案1:构建命令中直接允许不安全注册表
在docker buildx build命令中添加--allow insecure-registry=<registry>:5000参数,同时别忘了加上--push(buildx默认不自动推送,需要显式声明):
docker buildx build \ --builder my-builder \ --tag <registry>:5000/demo \ -f Dockerfile . \ --push \ --allow insecure-registry=<registry>:5000
方案2:创建构建器时预配置不安全注册表
创建构建器时,通过--buildkitd-flags指定允许不安全注册表,后续构建无需重复加参数:
docker buildx create --use --name my-builder \ --driver docker-container \ --driver-opt network=host \ --buildkitd-flags '--allow-insecure-entitlement security.insecure --registry-config <(echo "{\"insecure-registries\": [\"<registry>:5000\"]}")'
创建完成后,执行带--push的构建命令即可:
docker buildx build --builder my-builder --tag <registry>:5000/demo -f Dockerfile . --push
额外注意
- 确保你的本地镜像仓库确实是HTTP服务(未配置SSL证书),若后续配置了HTTPS证书,需移除上述不安全配置。
- 若使用
network=host驱动选项,需确认本地仓库在host网络下可正常访问。
内容的提问来源于stack exchange,提问作者Chris G.
相关产品推荐
相关产品推荐

