26

当前的 docker 测试版要求您在--platform=linux/amd64每次需要build时指定run一个 amd64 映像/容器。

文档提到

当运行具有多架构支持的映像时,docker 将自动选择与您的操作系统和架构匹配的映像变体。

该文档未指定使用 env 变量更改此自动行为的方法。它似乎忽略了 BUILDPLATFORM 和 TARGETPLATFORM。

有没有其他方法可以强制在一个平台docker上运行所有命令,build而不是默认在运行在 apple-silicon 上的 macOS 上?runlinux/amd64linux/arm64/v8

4

5 回答 5

55

你可以设置环境变量DOCKER_DEFAULT_PLATFORM

export DOCKER_DEFAULT_PLATFORM=linux/amd64  
于 2021-04-01T08:23:15.387 回答
29

使用 Apple Silicon(或其他基于 ARM64 的架构)构建的 Docker 镜像在将镜像部署到基于 Linux 或 Windows 的 AMD64 环境(例如 AWS EC2、ECS 等)时可能会产生问题。例如,您可以尝试上传您制作的 docker 镜像在 M1 芯片上复制到 AWS ECR 存储库,但它无法运行。因此,您需要一种在 ARM64 架构上构建基于 AMD64 的图像的方法,无论是使用 Docker build(用于单个图像)还是 docker-compose build(例如,用于在 docker compose 网络中运行的多图像应用程序)。

对于构建单个 docker 映像:使用命令行设置您的环境变量或按照接受的答案中的建议修改您的.bashrc或文件。.zshenv

export DOCKER_DEFAULT_PLATFORM=linux/amd64

或者,在 Dockerfile 中,在FROM命令中包含以下标志(对于多阶段Dockerfile构建,该标志仅在第一阶段需要):

FROM --platform=linux/amd64 python:3.7-alpine

对于构建镜像作为docker-compose构建的一部分,包括platform: linux/amd64每个服务的。例如:

services:  
  frontend:  
    platform: linux/amd64
    build: frontend  
    ports:
      - 80:80  
    depends_on:
      - backend  
  backend:  
    platform: linux/amd64
    build: backend  
于 2021-10-19T19:11:15.463 回答
10

您不需要像其中一个答案中提到的那样导出 env 变量,您可以通过执行以下操作将其作为命令的一部分一次运行:

DOCKER_DEFAULT_PLATFORM=linux/amd64 docker-compose build
于 2021-11-04T13:02:19.137 回答
-1

您还可以在 docker 构建中使用“平台”参数,如下所示:

docker build --platform linux/amd64 <rest of your build command>
于 2022-02-17T21:22:08.137 回答
-1

您可以使用支持 cli 平台的 buildx (mobi)。

docker buildx build --platform linux/amd64 .

于 2022-02-25T05:20:25.677 回答