语句IF与docker文件中的命令不起作用

j0pj023g  于 2023-04-29  发布在  Docker
关注(0)|答案(1)|浏览(135)

在我的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语句,或者至少像我在第一个例子中那样。

b1zrtrql

b1zrtrql1#

Docker从不运行shell,除了RUNENTRYPOINTCMD的shell形式。这意味着您将$MACHINE_ARCH的默认值设置为文字字符串$(uname -m),而不是运行该shell命令的结果。
通常,您不能将环境变量或默认构建参数值设置为shell命令的结果。参见Dockerfile - Defining an ENV variable with a dynamic value。在这种情况下,我可能只嵌入$(uname -m)替换;可以与shell case语句结合使用;可能在脚本中,而不是直接在Dockerfile中。
不过,在这种特定情况下,Docker提供了一组预定义的ARG,用于标识构建和目标架构。只要您使用这些名称之一,就不需要uname调用。文档建议这是一个类似armamd64的短名称,因此根据您正在做的事情,您甚至可能不需要将其重新Map为不同的值。

ARG TARGETARCH  # value provided by Docker BuildKit
ARG SOMETHING_VERSION=1.2.3
RUN curl http://download.example.com/something-$SOMETHING_VERSION/something-$TARGETARCH-$SOMETHING_VERSION.tar.gz

相关问题