如何在 docker buildx 时,在 Dockerfile 中获取编译平台信息

in #cn19 days ago

有时候在编译 Docker 镜像的时候,镜像内某些工具下载的时候,需要指定平台。

比如我在下载某个工具的时候,工具方提供的地址是类似下面这样的:

https://a.com/20250518/hclient-cli-amd64.tar.gz
https://a.com/20250518/hclient-cli-arm64.tar.gz

那么我们需要在 Dockerfile 执行过程中获取到编译平台的信息,是 amd64 还是 arm64。

实现方法很简单,如下:

ARG TARGETPLATFORM
ARG TARGETOS
ARG TARGETARCH

RUN echo "Building for platform: $TARGETPLATFORM" && \
    echo "Target OS: $TARGETOS" && \
    echo "Target Arch: $TARGETARCH"

只要在 Dockerfile 中加入三个 ARG 变量即可,这三个变量是预制的,docker buildx 会在构建的时候传入具体的值,效果如下:

 => [linux/amd64 2/4] RUN echo "Building for platform: linux/amd64" &&     echo "Target OS: linux" &&     echo "Target Arch: amd64" && sleep 60                                                                              4.7s
 => => # Building for platform: linux/amd64                                                                                                                                                                                      
 => => # Target OS: linux                                                                                                                                                                                                        
 => => # Target Arch: amd64                                                                                                                                                                                                      
 => [linux/arm64 2/4] RUN echo "Building for platform: linux/arm64" &&     echo "Target OS: linux" &&     echo "Target Arch: arm64" && sleep 60                                                                              4.7s
 => => # Building for platform: linux/arm64                                                                                                                                                                                      
 => => # Target OS: linux                                                                                                                                                                                                        
 => => # Target Arch: arm64