将 CAT 命令 unix 启动到 Dockerfile

launch a CAT command unix into Dockerfile

我想启动这个 vagrant 命令 cat(运行 完美!)来为我的容器提供 Dockerfile :

# Configure Virtualenvwrapper.
RUN cat <<EOF >> /home/docker/.bashrc
# Virtualenvwrapper configuration.
export WORKON_HOME=$HOME/.virtualenvs
export PROJECT_HOME=$HOME/Devel
source /usr/local/bin/virtualenvwrapper.sh
EOF

但是当我启动我的建筑图像时出现这个错误 return docker :

 ---> 40f9ed8e187d
Removing intermediate container 85f6c8536520
Step 69 : RUN cat <<EOF >> /home/docker/.bashrc
 ---> Running in dcbb3d441f79
 ---> 78acd9c2e5d5
Removing intermediate container dcbb3d441f79
Step 70 : EXPORT
Unknown instruction: EXPORT

运行 使用 Dockerfile 将 cat 命令 unix 转换为映像的技巧是什么?

Dockerfile 不是批处理文件。每个 line/command 都是隔离和提交的。

只需将内容放入文件中,然后 ADD/COPY 即可。如果您需要对其进行自定义,请对其进行 SED。或者,如果您真的、真的、真的想将 CAT 放入文件中——将其放入真正的批处理文件中,然后 ADD/COPY,然后 运行。

此外,更少的线条 = 更少的层数。 70 步?尤泽尔。

基于 this comment 在 Github 上发布的问题,此方法有效:

RUN echo 'All of your\n\
multiline that you ever wanted\n\
into a dockerfile\n'\
>> /etc/example.conf

你可以这样写:

RUN echo "# Virtualenvwrapper configuration." >> /home/docker/.bashrc && \
    echo "export WORKON_HOME=$HOME/.virtualenvs" >> /home/docker/.bashrc && \
    echo "export PROJECT_HOME=$HOME/Devel" >> /home/docker/.bashrc && \
    echo "source /usr/local/bin/virtualenvwrapper.sh" >> /home/docker/.bashrc

您也可以在 Dockerfile

中使用以下命令代替此处文档 <<
RUN echo $'[kubernetes] \n\
name=Kubernetes \n\
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64 \n\
enabled=1 \n\
gpgcheck=1 \n\
repo_gpgcheck=1 \n\
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg \n '\
> /etc/yum.repos.d/kubernetes.repo

更新 [07/29/2021]:从 dockerfile/dockerfile:1.3.0-labs 开始,Here-Document syntax is now supported with the Docker BuildKit backend enabled.

您需要使用 Docker Buildkit by setting DOCKER_BUILDKIT=1 in your environment, set the syntax 解析器指令才能使用 dockerfile/dockerfile:1.3.0-labs,并将此处分隔符的位置与 cat 交换。其余正常使用。

Docker文件示例:

# 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

把这个 shell cat 例子...

#!/usr/bin/env sh
cat <<EOF > /tmp/example.txt
line 1
line 2
line 3
EOF

... 进入此 Docker 文件 echo 示例!

RUN echo -e '\
line 1\n\
line 2\n\
line 3\
' > /tmp/example.txt

注意 echo 示例中的一对单引号 (')。

还要注意 echo-e 标志以支持转义换行符 (\n)。

注意: 不幸的是,根据您安装的 echo 版本,可能需要也可能不需要 -e 标志。例如,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重新定义。如果您的 Docker 文件具有不同的转义字符集,您需要相应地修改示例。