在Dockerfile中启动CAT命令unix

时间:2016-11-01 11:36:16

标签: unix docker dockerfile cat

我想启动这个流浪的命令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

但是当我启动构建图像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运行到图像中的技巧是什么?

5 个答案:

答案 0 :(得分:5)

这有效:

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

https://github.com/moby/moby/issues/1799

答案 1 :(得分:2)

Dockerfiles不是批处理文件。每个行/命令都是隔离并提交的。

只需将内容放入文件并添加/复制即可。如果你需要自定义它,SED吧。或者,如果你真的,真的,真的想把CAT放到一个文件中 - 把它放在一个真正的批处理文件中,然后添加/复制它,然后运行它。

此外,更少的线=更少的层。 70步? Yowzers。

答案 2 :(得分:2)

更新 [07/29/2021]:截至 dockerfile/dockerfile:1.3.0-labsHere-Document syntax is now supported with the Docker BuildKit backend enabled.

您需要通过在您的环境中设置 DOCKER_BUILDKIT=1 来使用 Docker Buildkit,将 syntax 解析器指令设置为使用 dockerfile/dockerfile:1.3.0-labs,并将此处分隔符的位置与 { 交换{1}}。其余的像往常一样使用。

Dockerfile 示例:

cat

在 Docker BuildKit 实验室频道 # 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 发布之前,不要使用 dockerfile/dockerfile:1.3.0-labs,而是尝试使用 cat

打开这个 shell echo 示例...

cat

...进入这个 Dockerfile #!/usr/bin/env sh cat <<EOF > /tmp/example.txt line 1 line 2 line 3 EOF 示例!

echo

注意 RUN echo -e '\ line 1\n\ line 2\n\ line 3\ ' > /tmp/example.txt 示例中的一对单引号 (')。

另请注意 echo-e 标志以支持转义换行符 (echo)。

警告:很遗憾,根据您的映像安装的 \n 版本,可能需要也可能不需要 -e 标志。例如,echo 图像的 npm:16 不需要 echo,实际上将打印 -e 和单引号行。另一方面,-e 图像的 ubuntu:20.04 确实需要 echo

同样的例子可以写在一行上: -e,但我觉得上面的例子更具可读性。

要回答 OP 的问题,请使用:

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

注意: 转义字符可以由 escape directive 重新定义。如果您的 Dockerfile 具有不同的转义字符集,您需要相应地修改示例。

答案 3 :(得分:1)

您还可以在Dockerfile中使用以下命令代替此处的文档 <<< / strong>

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

答案 4 :(得分:0)

您可以这样写:

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