Как писать команды с несколькими строками в файле Docker при сохранении новых строк?
Я хочу написать следующую команду RUN в Dockerfile. Но докер не сохраняет новые строки.
RUN echo "[repo] \
name = YUM Repository \
baseurl = https://example.com/packages/ \
enabled = 1 \
gpgcheck = 0" > /etc/yum.repos.d/Repo.repoxyz
Я знаю, что \
в конце каждой строки выходит за пределы новой строки. Но есть ли способ, которым я могу написать несколько строк, сохраняя новую строку?
Ответы
Ответ 1
Начните свою команду с $'
, завершите ее с '
и используйте \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
отредактировано (21.10.2019):
Как отметил @Anon ниже при обсуждении.
Функция $'...'
известна как "цитирование ANSI-C", но это не POSIX. особенность оболочки. Согласно с unix.stackexchange.com/a/371873/109111 изначально ksh93, но теперь она доступна в bash, zsh, mksh, FreeBSD sh и busybox ash (но только когда она скомпилирована с ENABLE_ASH_BASH_COMPAT).
Это НЕ доступно в dash, который является Ubuntu по умолчанию /bin/sh
Ответ 2
Я использовал printf
. Написание всего текста в одной строке с помощью "\n".
Выполнение:
RUN printf 'example \ntext \nhere' >> example.txt
вставки:
example
text
here
в example.txt
Ответ 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
при необходимости.
Ответ 4
Может быть, это поможет вам (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