如何在 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"]
我尝试了多种不同的方法来在 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"]