我想在Dockerfile中编写以下RUN命令。但是,docker并没有保留新的行。
RUN echo "[repo] \
name = YUM Repository \
baseurl = https://example.com/packages/ \
enabled = 1 \
gpgcheck = 0" > /etc/yum.repos.d/Repo.repoxyz
我知道每行末尾的\
都会逃脱新行。但是,有什么方法可以写多行保留新行吗?
答案 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字节)。
此解决方案的好处是它将与所有外壳一起使用。