【问题标题】:How to set Architecture for docker build to arm64?如何将 docker build 的架构设置为 arm64?
【发布时间】:2018-05-28 08:08:38
【问题描述】:

我有一个在 amd64 上运行但想在 arm64 上运行的 Dockerfile。由于 go build 工具将 GOARCH=arm64 作为参数,因此我不需要任何其他交叉编译工具来制作二进制文件。

# Run the build
FROM mojlighetsministeriet/go-polymer-faster-build
ENV WORKDIR /go/src/github.com/mojlighetsministeriet/email
COPY . $WORKDIR
WORKDIR $WORKDIR
RUN go get -t -v ./...
RUN CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build

# Create the final docker image
FROM scratch
COPY --from=0 /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt
COPY --from=0 /go/src/github.com/mojlighetsministeriet/email/email /
ENTRYPOINT ["/email"]

问题是生成的图像被标记为错误的架构 amd64 而不是 arm64。如何将参数传递给 docker build 以便将 Architecture 设置为 arm64?

$ docker image inspect mojlighetsministeriet/email-arm64                            
[
    {
        "Id": "sha256:33bcd7da8631c7a0829d61cc53479a26ab7f31fab1cb039105de415ddc6178f3",
        "RepoTags": [
            "mojlighetsministeriet/email-arm64:latest"
        ],
        "RepoDigests": [
            "mojlighetsministeriet/email-arm64@sha256:ab3f05d5597c3a304953b5c14f795179aa75bdfd458af3dc3cfb8b8d8eb87bc3"
        ],
        "Parent": "sha256:e5888262d93ea0946b5fd8146cf1c19ec3a7bac4d36eb51848ef0aefa75cf8e7",
        "Comment": "",
        "Created": "2017-12-05T18:36:36.273648787Z",
        "Container": "7a226edb3b52aaeeefec9e0fb4dd1da50d84992fb6cc374aeda9d82eec1bb2c8",
        "ContainerConfig": {
            "Hostname": "7a226edb3b52",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/sh",
                "-c",
                "#(nop) ",
                "ENTRYPOINT [\"/email\"]"
            ],
            "Image": "sha256:e5888262d93ea0946b5fd8146cf1c19ec3a7bac4d36eb51848ef0aefa75cf8e7",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": [
                "/email"
            ],
            "OnBuild": null,
            "Labels": {}
        },
        "DockerVersion": "17.10.0-ce",
        "Author": "",
        "Config": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": null,
            "Image": "sha256:e5888262d93ea0946b5fd8146cf1c19ec3a7bac4d36eb51848ef0aefa75cf8e7",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": [
                "/email"
            ],
            "OnBuild": null,
            "Labels": null
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 7861466,
        "VirtualSize": 7861466,
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/03cb0162bf922636e4e0ec90123b81565a447c6cd511741103551d2f0e7f09f9/diff",
                "MergedDir": "/var/lib/docker/overlay2/091f74815a0caf457df7e57ade43b41c4dd8551388beca44815a7038501742ee/merged",
                "UpperDir": "/var/lib/docker/overlay2/091f74815a0caf457df7e57ade43b41c4dd8551388beca44815a7038501742ee/diff",
                "WorkDir": "/var/lib/docker/overlay2/091f74815a0caf457df7e57ade43b41c4dd8551388beca44815a7038501742ee/work"
            },
            "Name": "overlay2"
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:66f615d03920919b0fa8bc9fed45515bb95636be1837fdd10a82b2c183e2ad5b",
                "sha256:bd6a01b885eb6e3eec38a3fe3a2899646509633730b210cf6987456fd40b8a1c"
            ]
        },
        "Metadata": {
            "LastTagTime": "2017-12-14T10:24:10.796813522+01:00"
        }
    }
]

【问题讨论】:

  • 我不确定这对我有什么帮助,我确实看到了一个用于创建 rust arm64/aarch64 二进制文件的设置,这部分我对上面的 Dockerfile 没有任何问题。二进制文件是正确的,它在我的 arm64 机器上启动,但是图像被标记为 amd64 而不是 arm64,这不会让我在我的 docker swarm 环境中安排图像。我需要一种更改图像元数据的 Architecture 属性的方法,但我似乎找不到这样做的方法。
  • 你找到答案了吗?我有一个类似的问题,我在 dotnet 中构建代码,这在设计上与平台无关,所以我不需要任何交叉构建设置来获得适用于 arm 的二进制文件,但是 docker 将我限制在构建机器的体系结构中。所以现在我不得不在 arm 机器上构建 arm 图像,这太慢了

标签: docker architecture cross-compiling arm64 docker-build


【解决方案1】:

我能够解决这个问题,虽然不是我想要的,但已经足够接近了。

  1. 有一台带 docker 的 amd64 Linux 机器

  2. 设置 qemu 用户静态以支持 arm https://hub.docker.com/r/multiarch/qemu-user-static/

  3. 在您的 docker 文件中使用支持 arm 的基本映像。例如。 ubuntu

  4. 使用类似于以下的命令构建映像:

    docker build --platform arm --pull -t your_tag .

此命令将强制 docker 拉取基础镜像的 arm 版本,并将 arm 架构设置为您的结果镜像。但要小心,如果你使用多架构的标签,上面的命令会将标签设置为 arm 版本。因此,要运行本机 amd64 版本,您需要在不使用 --platform arg 的情况下再次拉取标签。

【讨论】:

    【解决方案2】:

    https://docs.docker.com/desktop/multi-arch/

    # Shows builders installed
    docker buildx ls
    
    # Use builder that supports platform
    docker buildx use default
    
    docker buildx build --platform linux/arm64 -t <image_name>:<image_tag> --push .
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-10
      • 1970-01-01
      • 1970-01-01
      • 2022-12-14
      • 1970-01-01
      • 2018-08-02
      • 1970-01-01
      相关资源
      最近更新 更多