在 Ubuntu20.04 下构建 Arm 架构的 Docker 镜像

in #cn3 years ago

之前在 《完成了新的 Cloudflare DDNS 镜像包》这篇中实现了 Cloudflare 的 DDNS。

不过当时构建的是 x86 架构的镜像包,最近想要把这个功能迁移到我的树莓派上运行,因此需要重新基于 Arm 架构进行构建。

首先需要确认当前的机器环境是否满足使用 docker buildx 这个多架构的构建程序。

  • Docker >= 19.03
  • Linux kernel >= 4.8
  • binfmt_misc file system mounted
  • QEMU installed
  • binfmt-support package >= 2.1.7
  • Docker image based installation

目前我的系统上的 Docker 是 20.10.5 ,似乎不需要再设置实验模式了,直接执行 docker builx 是有回显内容的。

由于其他架构的编译需要在 QEMU 模拟器里进行,所以我还需要安装一下 QEMU。

sudo apt-get install -y qemu-user-static

接下来进到 Dockerfile 文件所在目录下尝试编译:

$ docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t ety001/cf-ddns:latest --push .

[+] Building 461.6s (35/35) FINISHED                                                     
 => [internal] booting buildkit                                                    20.4s
 => => pulling image moby/buildkit:buildx-stable-1                                 16.7s
 => => creating container buildx_buildkit_practical_dhawan0                         3.7s
 => [internal] load build definition from Dockerfile                                0.1s
 => => transferring dockerfile: 364B                                                0.0s
 => [internal] load .dockerignore                                                   0.1s
 => => transferring context: 2B                                                     0.0s
 => [linux/arm/v7 internal] load metadata for docker.io/library/alpine:latest       4.4s
 => [linux/arm64 internal] load metadata for docker.io/library/alpine:latest        4.1s
 => [linux/amd64 internal] load metadata for docker.io/library/alpine:latest        4.2s
 => [auth] library/alpine:pull token for registry-1.docker.io                       0.0s
 => [auth] library/alpine:pull token for registry-1.docker.io                       0.0s
 => [auth] library/alpine:pull token for registry-1.docker.io                       0.0s
 => [internal] load build context                                                   0.1s
 => => transferring context: 550B                                                   0.1s
 => [linux/arm64 builder 1/4] FROM docker.io/library/alpine:latest@sha256:adab3844  1.9s
 => => resolve docker.io/library/alpine:latest@sha256:adab3844f497ab9171f070d4cae4  0.1s
 => => sha256:58ab47519297212468320b23b8100fc1b2b96e8d342040806ae5 2.71MB / 2.71MB  0.6s
 => => extracting sha256:58ab47519297212468320b23b8100fc1b2b96e8d342040806ae509a77  1.3s
 => [linux/arm/v7 builder 1/4] FROM docker.io/library/alpine:latest@sha256:adab384  1.7s
 => => resolve docker.io/library/alpine:latest@sha256:adab3844f497ab9171f070d4cae4  0.2s
 => => sha256:136482bf81d1fa351b424ebb8c7e34d15f2c5ed3fc0b66b544b8 2.43MB / 2.43MB  0.5s
 => => extracting sha256:136482bf81d1fa351b424ebb8c7e34d15f2c5ed3fc0b66b544b8312bd  1.1s
 => [linux/amd64 builder 1/4] FROM docker.io/library/alpine:latest@sha256:adab3844  1.6s
 => => resolve docker.io/library/alpine:latest@sha256:adab3844f497ab9171f070d4cae4  0.1s
 => => sha256:5843afab387455b37944e709ee8c78d7520df80f8d01cf7f861a 2.81MB / 2.81MB  0.2s
 => => extracting sha256:5843afab387455b37944e709ee8c78d7520df80f8d01cf7f861aae63b  1.4s
 => [linux/amd64 stage-1 2/4] RUN apk --no-cache add curl                          11.1s
 => [linux/amd64 builder 2/4] WORKDIR /tmp                                          1.0s
 => [linux/arm/v7 stage-1 2/4] RUN apk --no-cache add curl                         33.7s
 => [linux/arm/v7 builder 2/4] WORKDIR /tmp                                         1.1s
 => [linux/arm64 stage-1 2/4] RUN apk --no-cache add curl                          35.3s
 => [linux/arm64 builder 2/4] WORKDIR /tmp                                          1.3s
 => [linux/amd64 builder 3/4] RUN apk --no-cache add go git                        76.5s
 => [linux/arm/v7 builder 3/4] RUN apk --no-cache add go git                      151.9s
 => [linux/arm64 builder 3/4] RUN apk --no-cache add go git                       154.4s
 => [linux/amd64 builder 4/4] RUN git clone https://github.com/nickw444/cf-ddns.g  39.5s
 => [linux/amd64 stage-1 3/4] COPY --from=builder /tmp/cf-ddns/cf-ddns /usr/bin/    0.5s
 => [linux/amd64 stage-1 4/4] ADD run.sh /usr/bin/run.sh                            0.4s
 => [linux/arm/v7 builder 4/4] RUN git clone https://github.com/nickw444/cf-ddns  263.7s
 => [linux/arm64 builder 4/4] RUN git clone https://github.com/nickw444/cf-ddns.  262.0s
 => [linux/arm/v7 stage-1 3/4] COPY --from=builder /tmp/cf-ddns/cf-ddns /usr/bin/   0.3s
 => [linux/arm/v7 stage-1 4/4] ADD run.sh /usr/bin/run.sh                           0.1s
 => [linux/arm64 stage-1 3/4] COPY --from=builder /tmp/cf-ddns/cf-ddns /usr/bin/    0.2s
 => [linux/arm64 stage-1 4/4] ADD run.sh /usr/bin/run.sh                            0.0s
 => exporting to image                                                             14.3s
 => => exporting layers                                                             8.0s
 => => exporting manifest sha256:967a24b9794cfa06e14d1ef3b8a862cddc0edc12ae8419c98  0.0s
 => => exporting config sha256:60c85a811f0d525f57cc63b338e76db5a41e110f889eb95c531  0.0s
 => => exporting manifest sha256:cda5813c95a5a85bae2dcaf757819fd0bfc0bf06ff3f27054  0.0s
 => => exporting config sha256:9395cc4c00930b2f8ca426c0a865b3f652895b594b74e7722ba  0.1s
 => => exporting manifest sha256:72680ea1587d6ddb850722310236b6c10938135c92ccb7e41  0.0s
 => => exporting config sha256:e3a2ff62ba3527ff6aa6308a9f9b87268f60187eb01eb0c3eb9  0.0s
 => => exporting manifest list sha256:e1293408ccfd4ff2966e9d7066bf6a0f18dbc621c48b  0.1s
 => => pushing layers                                                               4.2s
 => => pushing manifest for docker.io/ety001/cf-ddns:latest@sha256:e1293408ccfd4ff  1.8s
 => [auth] ety001/cf-ddns:pull,push token for registry-1.docker.io                  0.0s
 => [auth] ety001/cf-ddns:pull,push token for registry-1.docker.io                  0.0s
 => [auth] ety001/cf-ddns:pull,push token for registry-1.docker.io                  0.0s

完美编译并上传到了 Docker Hub。

去树莓派上运行了下,成功!


ET碎碎念,每周更新,欢迎订阅,点赞,转发!


好用不贵的VPS推荐

https://1hour.win


感谢你的阅读,我是中文区见证人之一,欢迎通过 AuthSteem 来给我投票,或者打开 https://steemitwallet.com/~witnesses 页面,输入 ety001 进行投票。

2.gif

中文区的见证人目前有:
支持一下他们(按字母顺序),一人可以有30票


Thank you for reading. I'm a witness. I would really appreciate your witness vote! You can vote by SteemLogin. Or open https://steemitwallet.com/~witnesses page, input ety001 to vote.

2.gif

Coin Marketplace

STEEM 0.16
TRX 0.13
JST 0.027
BTC 58986.04
ETH 2580.24
USDT 1.00
SBD 2.53