Outputing a multiline string from Dockerfile
I motsly use a Dockerfile by sourcing from a base ditribution: CentOS or Debian.
But I also have a local mirror and would like to use it for packages installation.
Espacially on CentOS it is about many lines to write to the /etc/yum.repos.d/CentOS-Base.repo file.
Easiest way: one RUN per line
The first method that comes in mind is to issue one RUN per line to write.Here you are:
RUN echo "[base] " > /etc/yum.repos.d/CentOS-Base.repo RUN echo "name=CentOS-$releasever - Base " >> /etc/yum.repos.d/CentOS-Base.repo RUN echo "baseurl=ftp://packages-infra.mg.rktmb.org/pub/centos/7/base-reposync-7 " >> /etc/yum.repos.d/CentOS-Base.repo RUN echo "gpgcheck=0 " >> /etc/yum.repos.d/CentOS-Base.repo RUN echo "[updates] " >> /etc/yum.repos.d/CentOS-Base.repo RUN echo "name=CentOS-$releasever - Updates " >> /etc/yum.repos.d/CentOS-Base.repo RUN echo "baseurl=ftp://packages-infra.mg.rktmb.org/pub/centos/7/updates-reposync-7 " >> /etc/yum.repos.d/CentOS-Base.repo RUN echo "gpgcheck=0 " >> /etc/yum.repos.d/CentOS-Base.repo RUN echo "[extras] " >> /etc/yum.repos.d/CentOS-Base.repo RUN echo "name=CentOS-$releasever - Extras " >> /etc/yum.repos.d/CentOS-Base.repo RUN echo "baseurl=ftp://packages-infra.mg.rktmb.org/pub/centos/7/extras-reposync-7 " >> /etc/yum.repos.d/CentOS-Base.repo RUN echo "gpgcheck=0 " >> /etc/yum.repos.d/CentOS-Base.repo RUN echo "[centosplus] " >> /etc/yum.repos.d/CentOS-Base.repo RUN echo "name=CentOS-$releasever - Plus " >> /etc/yum.repos.d/CentOS-Base.repo RUN echo "baseurl=ftp://packages-infra.mg.rktmb.org/pub/centos/7/centosplus-reposync-7 " >> /etc/yum.repos.d/CentOS-Base.repo RUN echo "gpgcheck=0 " >> /etc/yum.repos.d/CentOS-Base.repo RUN echo "[contrib] " >> /etc/yum.repos.d/CentOS-Base.repo RUN echo "name=CentOS-$releasever - Contrib " >> /etc/yum.repos.d/CentOS-Base.repo RUN echo "baseurl=ftp://packages-infra.mg.rktmb.org/pub/centos/7/contrib-reposync-7 " >> /etc/yum.repos.d/CentOS-Base.repo RUN echo "gpgcheck=0 " >> /etc/yum.repos.d/CentOS-Base.repo RUN echo "[epel-mada] " >> /etc/yum.repos.d/CentOS-Base.repo RUN echo "name=CentOS-$releasever - EPEL Mada " >> /etc/yum.repos.d/CentOS-Base.repo RUN echo "baseurl=ftp://packages-infra.mg.rktmb.org/pub/epel/7/epel-reposync-7 " >> /etc/yum.repos.d/CentOS-Base.repo RUN echo "gpgcheck=0 " >> /etc/yum.repos.d/CentOS-Base.repo
This has one big drawback: It creates one layer just for a line to write and that make it very slow. Obviously, this is a NOGO solution.
More subtle way: one multiline RUN
I found this solution from the Docker Github issue discussion about multiline.Just see how it is:
RUN echo $'[base] \n\ name=CentOS-$releasever - Base \n\ baseurl=ftp://packages-infra.mg.rktmb.org/pub/centos/7/base-reposync-7 \n\ gpgcheck=0 \n\ [updates] \n\ name=CentOS-$releasever - Updates \n\ baseurl=ftp://packages-infra.mg.rktmb.org/pub/centos/7/updates-reposync-7 \n\ gpgcheck=0 \n\ [extras] \n\ name=CentOS-$releasever - Extras \n\ baseurl=ftp://packages-infra.mg.rktmb.org/pub/centos/7/extras-reposync-7 \n\ gpgcheck=0 \n\ [centosplus] \n\ name=CentOS-$releasever - Plus \n\ baseurl=ftp://packages-infra.mg.rktmb.org/pub/centos/7/centosplus-reposync-7 \n\ gpgcheck=0 \n\ [contrib] \n\ name=CentOS-$releasever - Contrib \n\ baseurl=ftp://packages-infra.mg.rktmb.org/pub/centos/7/contrib-reposync-7 \n\ gpgcheck=0 \n\ [epel-mada] \n\ name=CentOS-$releasever - EPEL Mada \n\ baseurl=ftp://packages-infra.mg.rktmb.org/pub/epel/7/epel-reposync-7 \n\ gpgcheck=0 \n'\ > /etc/yum.repos.d/CentOS-Base.repo
Note the "$" on the first line.
This has the advantage of issuing only one RUN for all these lines, but be carefull to escape BASH special characters. One minor drawback I found is it screws syntax highlighting & indentation. But it's minor.
COPY a file
The last method I will cover here (becarefull, there are many other methods) is to have a CentOS-Base.repo file ready and jus copy it this way:COPY CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo
The only drawback I see for this is if you change its content and rebuild your image, you have to rebuild it without using the cache ( --no-cache). But it's fast and simple.