如何在Dockerfile中编写多行命令,同时保留新行?

时间:2015-10-30 15:13:41

标签: docker dockerfile

我想在Dockerfile中编写以下RUN命令。但是,docker并没有保留新的行。

RUN echo "[repo] \
name            = YUM Repository \
baseurl         = https://example.com/packages/ \
enabled         = 1 \
gpgcheck        = 0" > /etc/yum.repos.d/Repo.repoxyz

我知道每行末尾的\都会逃脱新行。但是,有什么方法可以写多行保留新行吗?

6 个答案:

答案 0 :(得分:70)

使用$'启动您的命令,以'结束命令,并使用\n\替换换行符,如下所示:

RUN echo $'[repo] \n\
name            = YUM Repository \n\
baseurl         = https://example.com/packages/ \n\
enabled         = 1 \n\
gpgcheck        = 0' > /etc/yum.repos.d/Repo.repoxyz

答案 1 :(得分:23)

我使用了printf。使用" \ n"。

将所有文本写在一行中

执行:

RUN printf 'example \ntext \nhere' >> example.txt

插入:

example
text
here

在example.txt中

答案 2 :(得分:3)

您可以使用:

RUN echo -e "\
[repo] \n\
name            = YUM Repository \n\
baseurl         = https://example.com/packages/ \n\
enabled         = 1 \n\
gpgcheck        = 0\
" > /etc/yum.repos.d/Repo.repoxyz

这样,您将可以快速查看文件内容。您只需要注意,您需要在每一行都以\结尾并在需要时插入\n

答案 3 :(得分:0)

可能对您有帮助(https://github.com/jen-soft/pydocker

[Dockerfile.py]

from pydocker import DockerFile  # sudo pip install -U pydocker

d = DockerFile(base_img='debian:8.2', name='jen-soft/custom-debian:8.2')

d.RUN_bash_script('/opt/set_repo.sh', r'''
cat >/etc/apt/sources.list <<EOL
deb     http://security.debian.org/ jessie/updates main
deb-src http://security.debian.org/ jessie/updates main
EOL
apt-get clean && apt-get update
''')

d.EXPOSE = 80
d.WORKDIR = '/opt'
d.CMD = ["python", "--version"]

# d.generate_files()
d.build_img()

# sudo wget -qO- https://get.docker.com/ | sh

python Dockerfile.py
docker images

答案 4 :(得分:0)

由于新行\n无法与echo一起使用,因此我最终使用了上面列出的示例。

RUN printf 'example \n\
text \n\
here' >> example.txt

它会产生预期的结果:

example
text
here

答案 5 :(得分:-1)

您可以多次执行RUN来完成文件:

RUN echo "[repo]" >> /etc/yum.repos.d/Repo.repoxyz
RUN echo "name            = YUM Repository" >> /etc/yum.repos.d/Repo.repoxyz
RUN echo "baseurl         = https://example.com/packages/" >> /etc/yum.repos.d/Repo.repoxyz
RUN echo "enabled         = 1" >> /etc/yum.repos.d/Repo.repoxyz
RUN echo "gpgcheck        = 0" >> /etc/yum.repos.d/Repo.repoxyz

这可能不是最佳解决方案,因为它会为每个RUN命令创建一个新层。尽管如此,每一层都将与您所做的更改一样大,在这种情况下,更改的大小为字节(第一个RUN层应为7字节)。

此解决方案的好处是它将与所有外壳一起使用。