Ich möchte den folgenden RUN-Befehl in die Docker-Datei schreiben. Docker behält die neuen Zeilen jedoch nicht bei.
RUN echo "[repo] \
name = YUM Repository \
baseurl = https://example.com/packages/ \
enabled = 1 \
gpgcheck = 0" > /etc/yum.repos.d/Repo.repoxyz
Ich weiß, dass \
am Ende jeder Zeile die neue Zeile entweicht. Aber gibt es eine Möglichkeit, mehrere Zeilen zu schreiben, wobei die neue Zeile erhalten bleibt?
docker
dockerfile
Venkata Jaswanth
quelle
quelle
Antworten:
Sie können das sogenannte "ANSI-C-Quoting" mit verwenden
$'...'
. Es war ursprünglich eine ksh93- Funktion , ist aber jetzt in bash, zsh, mksh, FreeBSD sh und in Busybox's Ash verfügbar (jedoch nur, wenn es mit ENABLE_ASH_BASH_COMPAT kompiliert wurde).Da RUN standardmäßig
/bin/sh
als Shell verwendet wird, müssen Sie zuerst mit der Anweisung SHELL zu etwas wie Bash wechseln.Beginnen Sie Ihren Befehl mit
$'
, beenden Sie ihn mit'
und verwenden Sie ihn\n\
für Zeilenumbrüche wie folgt:quelle
$' ... \n\
Technik hängt von der Shell ab, die DockerRUN
verwendetbash
. Auf einigen Systemen (wie Ubuntu) wird von der RUN-Shell/bin/sh
häufig eine Verknüpfung verwendet,dash
die NICHT istbash
und die$'
Syntax nicht versteht .Oh My Zsh
)Ich habe benutzt
printf
. Schreiben Sie den gesamten Text mit "\ n" in eine Zeile.Ausführen:
Beilagen:
in example.txt
quelle
Sie können verwenden:
Auf diese Weise haben Sie eine schnelle Möglichkeit, den Inhalt der Datei zu überprüfen. Sie müssen sich nur bewusst sein, dass Sie jede Zeile mit beenden
\
und\n
bei Bedarf einfügen müssen .quelle
echo -e
zu interpretieren\n
Am Ende habe ich eine Kombination der oben aufgeführten Beispiele verwendet, da die neue Zeile
\n
nicht funktioniert hatecho
.Wie erwartet wird Folgendes erzeugt:
quelle
Vielleicht hilft es Ihnen ( 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
quelle
Sie können RUN mehrmals ausführen, um Ihre Datei zu vervollständigen:
Dies ist möglicherweise nicht die optimale Lösung, da für jeden RUN-Befehl eine neue Ebene erstellt wird. Trotzdem ist jede Ebene so groß wie die Änderung, die Sie vornehmen. In diesem Fall liegt sie in der Reihenfolge der Bytes (die erste RUN-Ebene sollte 7 Byte groß sein).
Der Vorteil dieser Lösung ist, dass sie mit allen Schalen funktioniert.
quelle
&&
für bessere Caching-Zwecke, reduzierte Protokollierung und schnellereDockerfile
Erstellungszeiten zu verwenden