更新 [07/29/2021]:截至dockerfile/dockerfile:1.3.0-labs,Here-Document syntax is now supported with the Docker BuildKit backend enabled.
您需要通过在您的环境中设置DOCKER_BUILDKIT=1 来使用Docker Buildkit,将syntax 解析器指令设置为使用dockerfile/dockerfile:1.3.0-labs,并将此处分隔符的位置与cat 交换。其余的照常使用。
Dockerfile 示例:
# syntax = docker/dockerfile:1.3-labs
...
RUN <<EOF cat >> /home/docker/.bashrc
# Virtualenvwrapper configuration.
export WORKON_HOME=\$HOME/.virtualenvs
export PROJECT_HOME=\$HOME/Devel
source /usr/local/bin/virtualenvwrapper.sh
EOF
在 Docker BuildKit 实验室频道 dockerfile/dockerfile:1.3.0-labs 发布之前,不要使用 cat,而是尝试使用 echo!
转这个shellcat例子...
#!/usr/bin/env sh
cat <<EOF > /tmp/example.txt
line 1
line 2
line 3
EOF
...进入这个 Dockerfile echo 示例!
RUN echo -e '\
line 1\n\
line 2\n\
line 3\
' > /tmp/example.txt
注意echo 示例中的一对单引号 (')。
还要注意 echo 的 -e 标志以支持转义换行符 (\n)。
注意:很遗憾,-e 标志可能需要也可能不需要,具体取决于您的映像安装的 echo 版本。例如,npm:16 图像的echo 不需要-e,实际上将打印-e 以及单引号行。另一方面,ubuntu:20.04 图像的echo 确实需要-e。
同样的例子可以写成一行:
RUN echo -e 'line 1\nline 2\nline 3' >> /tmp/example.txt,但我发现上面的例子更具可读性。
要回答 OP 的问题,请使用:
# Configure Virtualenvwrapper.
RUN echo -e '\
# Virtualenvwrapper configuration.\n\
export WORKON_HOME=\$HOME/.virtualenvs\n\
export PROJECT_HOME=\$HOME/Devel\n\
source /usr/local/bin/virtualenvwrapper.sh\
' >> /home/docker/.bashrc
注意:转义字符可以由escape directive 重新定义。如果您的 Dockerfile 具有不同的转义字符集,则需要相应地修改示例。