↓ 跳过正文
  1. Posts/

Doker Buildx Build Error

·584 字·2 分钟
目录

背景
#

因为一直使用的时amd64的镜像包,最近部署的服务器上都是arm64的,需要重新Build镜像。打包时一直出现下面的问题:

docker buildx build --platform linux/arm64 -t xxxx:v2.0.0-arm64 --load .
[+] Building 30.0s (4/4) FINISHED                                                            docker-container:rebuilder
 => [internal] booting buildkit                                                                                    2.8s
 => => pulling image moby/buildkit:buildx-stable-1                                                                 1.4s
 => => creating container buildx_buildkit_rebuilder0                                                               1.3s
 => [internal] load build definition from Dockerfile                                                               0.1s
 => => transferring dockerfile: 3.53kB                                                                             0.0s
 => ERROR [internal] load metadata for docker.io/library/python:3.11-slim                                         26.9s
 => [auth] library/python:pull token for registry-1.docker.io                                                      0.0s
------
 > [internal] load metadata for docker.io/library/python:3.11-slim:
------
Dockerfile:2
--------------------
   1 |     # 使用官方 Python 3.11 镜像,它原生支持 amd64/arm64
   2 | >>> FROM python:3.11-slim
   3 |
   4 |     # 设置环境变量(与原镜像保持一致)
--------------------
ERROR: failed to build: failed to solve: failed to fetch oauth token: Post "https://auth.docker.io/token": dial tcp 162.125.6.1:443: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.

View build details: docker-desktop://dashboard/build/rebuilder/rebuilder0/11csl1nm8xykhruo2puojo06p

原因
#

我是在Windows中安装了Docker Desktop。但是它默认会自带Buildx:

docker buildx ls
NAME/NODE           DRIVER/ENDPOINT     STATUS     BUILDKIT   PLATFORMS
default             docker
 \_ default          \_ default         running    v0.32.2    linux/amd64 (+3), linux/arm64, linux/arm (+2), linux/ppc64le, (2 more)
desktop-linux       docker
 \_ desktop-linux    \_ desktop-linux   running    v0.32.2    linux/amd64 (+3), linux/arm64, linux/arm (+2), linux/ppc64le, (2 more)

但是我又重新创建了一个名为rebuilder的Buildx

docker buildx create --name rebuilder --use

此时,打包就会报错。

然后我又想到使用本机代理

docker buildx rm rebuilder
docker buildx create --name rebuilder `
>   --driver docker-container `
>   --driver-opt network=host `
>   --use

依旧报错。 那就指定代理:使用了局域网IP,以及开启了局域网连接。

docker buildx create --name rebuilder `
>   --driver docker-container `
>   --driver-opt env.HTTP_PROXY=http://172.16.10.53:7897 `
>   --driver-opt env.HTTPS_PROXY=http://172.16.10.53:7897 `
>   --use

依旧报错。 暂时没空研究原因时为啥todo一下。

解决
#

docker buildx ls
NAME/NODE           DRIVER/ENDPOINT     STATUS    BUILDKIT   PLATFORMS
rebuilder*          docker-container
 \_ rebuilder0       \_ desktop-linux   running   v0.32.2    linux/amd64 (+3), linux/arm64, linux/arm (+2), linux/ppc64le, (3 more)
default             docker
 \_ default          \_ default         running   v0.32.2    linux/amd64 (+3), linux/arm64, linux/arm (+2), linux/ppc64le, (2 more)
desktop-linux       docker
 \_ desktop-linux    \_ desktop-linux   running   v0.32.2    linux/amd64 (+3), linux/arm64, linux/arm (+2), linux/ppc64le, (2 more)

看到了自带的desktop-linux,那就试试吧

docker buildx use desktop-linux

然后执行打包命令

docker buildx build --platform linux/arm64 -t xxx:v2.0.0-arm64 --load .

丝滑!!!但是Why?