我想启动这个流浪的命令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运行到图像中的技巧是什么?
答案 0 :(得分:5)
这有效:
RUN echo $'All of your\n\
multiline that you ever wanted\n\
into a dockerfile\n'\
>> /etc/example.conf
答案 1 :(得分:2)
Dockerfiles不是批处理文件。每个行/命令都是隔离并提交的。
只需将内容放入文件并添加/复制即可。如果你需要自定义它,SED吧。或者,如果你真的,真的,真的想把CAT放到一个文件中 - 把它放在一个真正的批处理文件中,然后添加/复制它,然后运行它。
此外,更少的线=更少的层。 70步? Yowzers。
答案 2 :(得分:2)
更新 [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
,并将此处分隔符的位置与 { 交换{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