Chcę napisać następujące polecenie RUN w pliku Dockerfile. Jednak docker nie zachowuje nowych wierszy.
RUN echo "[repo] \
name = YUM Repository \
baseurl = https://example.com/packages/ \
enabled = 1 \
gpgcheck = 0" > /etc/yum.repos.d/Repo.repoxyz
Wiem, że \
na końcu każdej linii ucieka nowa linia. Ale czy jest jakiś sposób, żebym mógł napisać wiele wierszy z zachowaniem nowego wiersza?
docker
dockerfile
Venkata Jaswanth
źródło
źródło
Odpowiedzi:
Możesz używać tak zwanego „cytowania ANSI-C” z
$'...'
. Pierwotnie była to funkcja ksh93, ale teraz jest dostępna w bash, zsh, mksh, FreeBSD sh oraz w popiele busyboxa (ale tylko wtedy, gdy jest skompilowany z ENABLE_ASH_BASH_COMPAT).Ponieważ RUN używa
/bin/sh
domyślnie powłoki jako powłoki, musisz najpierw przełączyć się na coś takiego jak bash, używając instrukcji SHELL.Rozpocznij polecenie
$'
, zakończ je'
i używaj\n\
do nowych linii, na przykład:źródło
$' ... \n\
technika zależy od powłoki, której dockerRUN
używabash
. W niektórych systemach (takich jak Ubuntu) powłoka RUN używa/bin/sh
często łącza, dodash
którego NIE jestbash
i nie rozumie$'
składni.Oh My Zsh
)Użyłem
printf
. Pisanie całego tekstu w jednej linii za pomocą "\ n".Wykonywanie:
wkładki:
w example.txt
źródło
Możesz użyć:
W ten sposób będziesz mieć szybki sposób sprawdzenia, jaka jest zawartość pliku. Musisz tylko mieć świadomość, że musisz kończyć każdą linię
\
i wstawiać,\n
gdy jest to potrzebne.źródło
echo -e
interpretacji\n
Skończyło się na tym, że użyłem kombinacji przykładów wymienionych powyżej, ponieważ nowa linia
\n
nie działałaecho
.Zgodnie z oczekiwaniami generuje:
źródło
Może to ci pomoże ( 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
źródło
Możesz wykonać RUN kilka razy, aby ukończyć plik:
Może to nie być optymalne rozwiązanie, ponieważ tworzy nową warstwę dla każdego polecenia RUN. Mimo to każda warstwa będzie tak duża, jak wprowadzona przez Ciebie zmiana, czyli w tym przypadku w kolejności bajtów (pierwsza warstwa RUN powinna mieć rozmiar 7-bajtowy).
Zaletą tego rozwiązania jest to, że będzie działać ze wszystkimi powłokami.
źródło
&&
lepszymi celami buforowania, krótszym rejestrowaniem i krótszymDockerfile
czasem kompilacji