强制 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 测试版要求您在每次需要 build
或 run
amd64 映像/容器时指定 --platform=linux/amd64
。
文档提到
当运行具有多架构支持的映像时,docker 将自动选择与您的操作系统和架构匹配的映像变体。
文档没有指定使用环境变量来改变这种自动行为的方法。它似乎忽略了 BUILDPLATFORM 和 TARGETPLATFORM。
是否有任何其他方法可以强制docker
以linux/amd64
平台而不是linux/arm64/v8
默认情况下在运行apple-silicon 的macOS 上运行所有build
和run
命令?
【问题讨论】:
【参考方案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