检查dockerfile中的架构以获取amd/arm

问题描述 投票:0回答:2

我们正在使用 Windows 和 Mac M1 机器使用 Docker 进行本地开发,并且需要在我们的 docker 环境中获取并安装 .deb 包。

该软件包需要 amd64/arm64,具体取决于所使用的架构。

有没有办法在 docker 文件中确定这一点,即

if xyz === 'arm64'
    RUN wget http://...../arm64.deb
else 
    RUN wget http://...../amd64.deb
docker debian x86-64 cpu-architecture apple-m1
2个回答
24
投票

首先,您需要检查是否没有其他(更简单)的方法可以使用包管理器来完成此操作。

您可以使用

arch
命令获取架构(相当于
uname -m
)。问题是它不会返回您期望的值(
aarch64
而不是
arm64
x86_64
而不是
amd64
)。所以你必须转换它,我已经通过
sed
完成了。

RUN arch=$(arch | sed s/aarch64/arm64/ | sed s/x86_64/amd64/) && \
    wget "http://...../${arch}.deb"

注意:在运行此命令之前应添加以下代码,以防止管道链出现故障时出现意外行为。请参阅 Hadolint

DL4006
了解更多信息。

SHELL ["/bin/bash", "-o", "pipefail", "-c"]

3
投票

Docker 的更高版本使用全局变量公开有关当前架构的信息:

BUILDPLATFORM — matches the current machine. (e.g. linux/amd64) BUILDOS — os component of BUILDPLATFORM, e.g. linux BUILDARCH — e.g. amd64, arm64, riscv64 BUILDVARIANT — used to set ARM variant, e.g. v7 TARGETPLATFORM — The value set with --platform flag on build TARGETOS - OS component from --platform, e.g. linux TARGETARCH - Architecture from --platform, e.g. arm64 TARGETVARIANT
请注意,您可能需要在无头计算机上

export DOCKER_BUILDKIT=1

才能使这些功能正常工作,并且它们在 Docker Desktop 上默认启用。

在条件脚本中使用,如下所示:

RUN wget "http://...../${TARGETARCH}.deb"
您甚至可以使用 ONBUILD

分支 Dockerfile,如下所示:

FROM alpine as build_amd # Intel stuff goes here ONBUILD RUN apt-get install -y intel_software.deb FROM alpine as build_arm # ARM stuff goes here ONBUILD RUN apt-get install -y arm_software.deb # choose the build to use for the rest of the image FROM build_${TARGETARCH} # rest of the dockerfile follows
    
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.