已配置insecure-registries,docker build拉取私有镜像仍报HTTP响应HTTPS错误
问题根源定位
这个问题是开启BuildKit作为默认构建器后,旧版本BuildKit未正确继承Docker daemon的insecure-registries配置导致的,和你本地的insecure-registries配置正确性无关,具体逻辑如下:
- Docker 20.10+版本开启BuildKit后,
docker build实际调用BuildKit组件完成构建,你使用的BuildKit版本(v0.6.1,对应docker info里的buildx插件版本)存在已知缺陷:不会读取daemon.json里的insecure-registries配置,拉取基础镜像时默认强制走HTTPS协议,因此会报http: server gave HTTP response to HTTPS client错误 - 而
docker pull、docker push走的是Docker daemon原生的镜像交互逻辑,会正确加载insecure-registries配置,所以这两个操作可以正常运行
解决方案
方案1:临时关闭BuildKit执行构建
单次构建时临时禁用BuildKit即可正常拉取镜像:
DOCKER_BUILDKIT=0 docker build .
如果要全局关闭,修改daemon.json里的features配置,将buildkit设为false后重启Docker Desktop即可:
{ "features" : { "buildkit" : false } }
方案2:升级Docker Desktop到最新版本
该BuildKit缺陷在后续版本已经修复,升级到Docker Desktop 4.2.0及以上版本(对应BuildKit v0.9+)后,BuildKit会自动继承daemon的insecure-registries配置,不需要额外修改即可正常构建。
方案3:给BuildKit单独配置私有仓库规则
如果不想关闭BuildKit也不想升级版本,可以在BuildKit配置文件中添加私有仓库的HTTP访问规则,Docker Desktop可以直接在设置页的BuildKit配置项中添加如下内容:
[registry."<dns-name>:<port>"] http = true insecure = true
配置完成后重启Docker即可生效。
注:insecure-registries的配置本身不需要加http://前缀,官方要求格式就是
host:port或者CIDR段,你之前加http前缀报错属于正常现象,不需要调整该配置的格式。
内容的提问来源于stack exchange,提问作者DeimosDeveloper
相关产品推荐
相关产品推荐

