docker - 标准 docker Push 有效,但 buildx(docker-container) 无效 - 导出到镜像时出错

标签 docker buildx

我正在尝试将 buildx 推送到本地注册表。我有docker login <registry>成功。

我正在 macos 上构建。看起来和docker-container有关系。 .

标准 Docker 工作原理:

docker build -t <registry>/demo
docker push <registry>/demo

但是 buildx 不起作用:

docker buildx create --use --name my-builder --driver-opt network=host --buildkitd-flags '--allow-insecure-entitlement network.host' --use

或者这个:

docker buildx create --name my-builder --platform $platforms --driver docker-container --driver-opt network=host --use

我收到此错误:

docker buildx build --builder my-builder --tag <registry>:5000/demo -f Dockerfile .

 ...
 => ERROR exporting to image                                                                                                                                                                                               0.3s
 => => exporting layers                                                                                                                                                                                                    0.2s
 => => exporting manifest sha256:b7bbe730a33ba61b903b4371ded8057dd1a129fd60ff261e3a3ce5ef3425924e                                                                                                                          0.0s
 => => exporting config sha256:c38954cc53caf2cc4dd08ea836c3f2ab8951f400ce6731401628c9ba78f4ce5f                                                                                                                            0.0s
 => => pushing layers                                                                                                                                                                                                      0.0s
------
 > exporting to image:
------
ERROR: failed to solve: failed to do request: Head "https://<registry>:5000/v2/demo/blobs/sha256:659301074bba138f5e7a1896fbe03daa5d95ce5b4f804af5a2c9ea03e9411b8b": http: server gave HTTP response to HTTPS client

使用 buildx 推送有什么特别需要做的吗?

最佳答案

如果您使用的是本地注册表,例如:

$ docker run -d -p 5001:5000 --restart always --nameregistryregistry:2

(在我的设置中,本地注册表端口是 5001 而不是 5000,因为 mac osx(m1 应用芯片)在该端口上有一个进程)。

那么您可能需要创建自定义 buildx(bash 脚本),例如:

#!/bin/sh
name=container-builder
docker buildx ls | grep -q $name && docker buildx rm $name
docker buildx create --driver-opt network=host --use --config config.toml --name $name

并且 config.toml 文件具有:

[registry."localhost:5001"]
  http = true

此外,对于 Docker 引擎中的本地注册表(通过仪表板),添加到 docker 守护进程配置中:

  "experimental": true,
  "features": {
    "buildkit": true
  },
  "insecure-registries": [
    "localhost:5001"
  ]

这应该可以修复本地注册表的 http 与 https 错误。

关于docker - 标准 docker Push 有效,但 buildx(docker-container) 无效 - 导出到镜像时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73612351/

相关文章:

authentication - Docker:保护私有(private)注册表的最简单方法是什么?

docker - 如何将多架构 docker 镜像复制到不同的容器注册表?

docker - 在多节点 Docker 构建中,层缓存存储在哪里?缓存垃圾回收何时发生?

docker - 使用 WSL 2 引擎运行 docker 桌面时使用的 docker-desktop-data 发行版是什么

windows - Docker for Windows 如何运行 Linux 容器?

.net - Docker Buildkit --mount=type=cache 用于缓存 .NET 6 的 Nuget 包

docker - 如何使用 docker buildx 顺序构建镜像

docker - Dockerfile 中的多个 RUN 条目和只有一个 RUN 条目有什么区别?

java - Docker maven 镜像正在创建 root 拥有的目标文件夹,并且 Jenkins 无法将其从其工作区中删除