在我的Dockerfile中,我有一个if语句,我想检查机器架构并设置这个新参数,稍后我将使用它来下载正确的文件。更好的做法是将新参数设置在RUN命令之外,但我认为这是不可能的。
ARG MACHINE_ARCH=$(uname -m)
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
RUN \
apt-get update && \
\
if [ "$MACH_ARCH" = "aarch64" ]; then TARGET_ARCH="arm64"; \
\
elif [ "$MACH_ARCH" = "x86_64" ]; then TARGET_ARCH="amd64"; fi && \
...
如果我在RUN
命令中直接将"$MACH_ARCH"
替换为$(uname -m)
,那么它就可以工作:
RUN \
apt-get update && \
\
if [ "$(uname -m)" = "aarch64" ]; then TARGET_ARCH="arm64"; \
...
另一个解决方案是直接在RUN
命令中添加参数BUILD_ARCH
,类似于这样的:
RUN \
apt-get update && \
\
BUILD_ARCH=$(uname -m) && \
\
if [ "$BUILD_ARCH" = "aarch64" ]; then TARGET_ARCH="arm64"; \
...
但是我希望在RUN命令之外有if语句,或者至少像我在第一个例子中那样。
1条答案
按热度按时间b1zrtrql1#
Docker从不运行shell,除了
RUN
、ENTRYPOINT
和CMD
的shell形式。这意味着您将$MACHINE_ARCH
的默认值设置为文字字符串$(uname -m)
,而不是运行该shell命令的结果。通常,您不能将环境变量或默认构建参数值设置为shell命令的结果。参见Dockerfile - Defining an ENV variable with a dynamic value。在这种情况下,我可能只嵌入
$(uname -m)
替换;可以与shellcase
语句结合使用;可能在脚本中,而不是直接在Dockerfile中。不过,在这种特定情况下,Docker提供了一组预定义的
ARG
,用于标识构建和目标架构。只要您使用这些名称之一,就不需要uname
调用。文档建议这是一个类似arm
或amd64
的短名称,因此根据您正在做的事情,您甚至可能不需要将其重新Map为不同的值。