我知道只需运行以下命令即可获得Docker引擎的体系结构:
root@minus:~# docker info | grep Architecture
Architecture: armv7l
我也在其他架构上对其进行了测试,并且运行良好(在arm64上为aarch64
,在英特尔服务器上为x86_64
)。
我的问题是在Dockerfile中是否有一个特殊的变量(像参数一样可用)。我知道可以为此使用ARG
,但这意味着它必须由调用方设置,我想拥有一些更自动的功能。
我将使用它来为架构自动下载正确的图像。我已经搜索了很多东西,但没有发现任何东西,如果有办法,我会很高兴;)。
谢谢。
答案 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)"; \