是否可以在Dockerfile中获取Docker引擎的体系结构?

时间:2018-10-29 15:36:01

标签: docker dockerfile

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

root@minus:~# docker info | grep Architecture
Architecture: armv7l

我也在其他架构上对其进行了测试,并且运行良好(在arm64上为aarch64,在英特尔服务器上为x86_64)。

我的问题是在Dockerfile中是否有一个特殊的变量(像参数一样可用)。我知道可以为此使用ARG,但这意味着它必须由调用方设置,我想拥有一些更自动的功能。

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

谢谢。

2 个答案:

答案 0 :(得分:1)

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

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

这些内容记录在builder documentation的“全球范围内的自动平台ARG”中。

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

export DOCKER_BUILDKIT=1

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

答案 1 :(得分:0)

在某些官方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; \
        ...

Debian releases中,使用dpkg代替了apk

        dpkgArch="$(dpkg --print-architecture)"; \