如何在 Dockerfile 中分配数组?

How do you assign an Array inside a Dockerfile?

我尝试了多种不同的方法来在 Dockerfile 中的 RUN 命令中分配一个数组。 None 其中似乎有效。我在 Ubuntu-Slim 上 运行,bash 作为我的默认值 shell。

我试过了(下面第二行)

RUN addgroup --gid 1000 node \
    && NODE_BUILD_PACKAGES=("binutils-gold" "g++" "gcc" "gnupg" "libgcc-7-dev" "linux-headers-generic" "make" "python3" ) \
...

但是它失败了/bin/sh: 1: Syntax error: "(" unexpected

我还尝试将其分配为 ENV 变量,如:

ENV NODE_BUILD_PACKAGES=("binutils-gold" "g++" "gcc" "gnupg" "libgcc-7-dev" "linux-headers-generic" "make" "python3" )

但这也失败了。

完全支持在 Bash 中分配和使用数组。但是,在 Dockerfile 中 运行 时,我似乎无法使用 Bash 的该功能。 有人 confirm/deny 可以在 Dockerfile 运行 语法(或 ENV 变量语法)中的 shell 命令中分配数组变量吗?

POSIX shell specification没有数组。即使您使用 non-standard shell 之类的 GNU bash,环境变量也始终是简单的字符串,并且永远不会保存数组。

Docker中的默认shell通常是/bin/sh,它应该符合POSIX规范,而不是bash。 Alpine-based 图像根本没有 bash,除非您特意安装它。我通常建议尽可能坚持使用 POSIX 语法。

典型的 Docker 文件相当简单;它没有很多可以重复使用多次的部分,而且您可以在 Docker 文件中指定的大部分内容不需要 user-configurable。因此,例如,对于 OS 包的列表,我只是将它们列在 RUN 命令中,而不会费心尝试将它们打包到变量中。

RUN apt-get update \
 && DEBIAN_FRONTEND=noninteractive \
    apt-get install --no-install-recommends --assume-yes \
      binutils-gold \
      g++ \
      gcc \
      ...

我在 Stack Overflow 问题中看到的其他不需要参数化的内容包括容器路径(将其设置为 WORKDIR 然后参考 .),进程的端口(第二个 docker run -p 部分需要一个固定数字)和用户 ID(可以用 docker run -u 覆盖,并且您通常不想构建只能 运行 的图像在一个系统上)。

WORKDIR /app      # not an ENV or ARG
COPY . .          # into the WORKDIR, do not need to repeat
RUN adduser node  # with no specific uid
EXPOSE 3000       # a fixed port number
RUN mkdir /data   # also use a fixed path for potential mount points

如果定义 SHELL :

,则可以在 RUN 中包含数组 NODE_BUILD_PACKAGES
SHELL ["/bin/bash", "-c"]