是否可以在 Dockerfile 中获取 docker 引擎的架构?

seb*_*cas 4 docker dockerfile

我知道只需运行以下命令即可获得 Docker 引擎的架构:

root@minus:~# docker info | grep Architecture
Architecture: armv7l
Run Code Online (Sandbox Code Playgroud)

我还在其他架构上测试过它,它运行良好(aarch64在 arm64 和x86_64我的英特尔服务器上)。

我的问题是有一个特殊的变量(可以像参数一样使用),其架构在 Dockerfile 中可用。我知道可以为此使用 an ARG,但这意味着它必须由调用者设置,我想要更自动的东西。

我会用它来自动下载架构的正确图像。我已经搜索了很多,但没有找到任何东西,如果有办法,我会很高兴;)。

提前致谢。

Bob*_*ers 17

在一些官方 Docker 镜像中,有基于架构的条件代码执行的示例。golang例如,Dockerfile 使用包管理器报告架构,然后有条件case地运行语句,所有这些都在来自RUN. 来自golang 1.13:alpine

    RUN ...
        apkArch="$(apk --print-arch)"; \
        case "$apkArch" in \
            armhf) export GOARM='6' ;; \
            x86) export GO386='387' ;; \
        esac; \
        ...
Run Code Online (Sandbox Code Playgroud)

Debian 版本中,dpkg使用 , 代替apk

        dpkgArch="$(dpkg --print-architecture)"; \
Run Code Online (Sandbox Code Playgroud)


BMi*_*tch 5

如果您使用 BuildKit 进行构建,则可以使用一些预定义的 ARG:

  • TARGETPLATFORM - 构建结果的平台。例如 linux/amd64、linux/arm/v7、windows/amd64。
  • TARGETOS - TARGETPLATFORM 的操作系统组件
  • TARGETARCH - TARGETPLATFORM 的架构组件
  • TARGETVARIANT - TARGETPLATFORM 的变体组件
  • BUILDPLATFORM - 执行构建的节点的平台。
  • BUILDOS - BUILDPLATFORM 的操作系统组件
  • BUILDARCH - BUILDPLATFORM 的 OS 组件
  • BUILDVARIANT - BUILDPLATFORM 的操作系统组件

这些记录在构建器文档的“全局范围内的自动平台 ARG”中。

要使用 BuildKit,您可以在 shell 中使用变量启用它:

export DOCKER_BUILDKIT=1
Run Code Online (Sandbox Code Playgroud)

然后构建使用docker build(正在使用 docker-compose 支持 BuildKit,可能在下一个版本中)。