强制 docker 在 macOS 上默认使用 linux/amd64 平台

Posted

技术标签:

【中文标题】强制 docker 在 macOS 上默认使用 linux/amd64 平台【英文标题】:Forcing docker to use linux/amd64 platform by default on macOS 【发布时间】:2021-04-13 04:21:44 【问题描述】:

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

文档提到

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

文档没有指定使用环境变量来改变这种自动行为的方法。它似乎忽略了 BUILDPLATFORM 和 TARGETPLATFORM。

是否有任何其他方法可以强制dockerlinux/amd64 平台而不是linux/arm64/v8 默认情况下在运行apple-silicon 的macOS 上运行所有buildrun 命令?

【问题讨论】:

【参考方案1】:

可以设置环境变量DOCKER_DEFAULT_PLATFORM

export DOCKER_DEFAULT_PLATFORM=linux/amd64  

【讨论】:

这是在 03/2019 的 v19.03.0 中引入的。我不明白我是怎么错过的。【参考方案2】:

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

用于构建单个 docker 镜像: 使用命令行设置您的环境变量或按照接受的答案中的建议修改您的 .bashrc 或 .zshenv 文件(即 export DOCKER_DEFAULT_PLATFORM=linux/amd64)。

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

  (例如 FROM --platform=linux/amd64 python:3.7-alpine)

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

docker-compose.yml 服务: 前端:平台:linux/amd64 构建:前端 端口: - 80:80 依赖: - 后端 后端:平台:linux/amd64 构建:后端

【讨论】:

“问题”的根源是什么?您的意思是在 AMD64 平台上意外运行 ARM 映像?有可能吗? 我更喜欢这个解决方案(我正在使用 docker-compose)而不是在主机操作系统上设置环境变量的公认答案 这很好用。我正在使用 docker-compose 在 M1 MacBook Pro 上构建 linux/amd64 应用程序。【参考方案3】:

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

DOCKER_DEFAULT_PLATFORM=linux/amd64 docker-compose build

【讨论】:

以上是关于强制 docker 在 macOS 上默认使用 linux/amd64 平台的主要内容,如果未能解决你的问题,请参考以下文章

markdown 在VirtualBox和本地Docker注册表上使用minikube在macOS上设置本地Kubernetes

markdown 在VirtualBox和本地Docker注册表上使用minikube在macOS上设置本地Kubernetes

在 MacOS 上运行 Docker 太慢!

在 MacOS 上运行 Docker 太慢!

Dockerized Celery 部署无需强制 KILL 工作人员(ECS | Beanstalk 多容器)

Traefik docker 映像不能在 Windows 上运行但在 MacOS 上运行?