Quiero escribir el siguiente comando RUN en el Dockerfile. Pero Docker no conserva las nuevas líneas.
RUN echo "[repo] \
name = YUM Repository \
baseurl = https://example.com/packages/ \
enabled = 1 \
gpgcheck = 0" > /etc/yum.repos.d/Repo.repoxyz
Sé que \
al final de cada línea se escapa la nueva línea. Pero, ¿hay alguna forma de que pueda escribir varias líneas conservando la nueva línea?
docker
dockerfile
Venkata Jaswanth
fuente
fuente
Respuestas:
Puede utilizar lo que se denomina "cotización ANSI-C" con
$'...'
. Originalmente era una característica de ksh93 pero ahora está disponible en bash, zsh, mksh, FreeBSD sh y en el ash de busybox (pero solo cuando está compilado con ENABLE_ASH_BASH_COMPAT).Como RUN usa
/bin/sh
como shell por defecto , se requiere que cambie primero a algo como bash usando la instrucción SHELL.Comience su comando con
$'
, termínelo con'
y utilícelo\n\
para nuevas líneas, así:fuente
$' ... \n\
técnica depende del shell queRUN
utilice Dockerbash
. En algunos sistemas (como Ubuntu), el shell RUN que utiliza/bin/sh
es a menudo un enlace aldash
que NO lo esbash
y no comprende la$'
sintaxis.Oh My Zsh
ninguno de los dos)Yo usé
printf
. Escribir todo el texto en una línea usando "\ n".Ejecutando:
inserciones:
en ejemplo.txt
fuente
Puedes usar:
De esta manera, tendrá una forma rápida de verificar el contenido del archivo. Solo debe tener en cuenta que debe terminar cada línea con
\
e insertar el\n
cuando sea necesario.fuente
echo -e
interpretar\n
Terminé usando una combinación de los ejemplos enumerados anteriormente ya que la nueva línea
\n
no funcionó conecho
.Produce lo siguiente, como se esperaba:
fuente
Puede que te ayude ( 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
fuente
Puede ejecutar RUN varias veces para completar su archivo:
Esta puede no ser la solución óptima porque crea una nueva capa para cada comando RUN. Aún así, cada capa será tan grande como el cambio que realice, que en este caso es del orden de Bytes (la primera capa RUN debe ser de 7 bytes).
El beneficio de esta solución es que funcionará con todos los shells.
fuente
&&
mejores propósitos de almacenamiento en caché, registro reducido yDockerfile
tiempos de compilación más rápidos