Подтвердить что ты не робот

Как писать команды с несколькими строками в файле Docker при сохранении новых строк?

Я хочу написать следующую команду RUN в Dockerfile. Но докер не сохраняет новые строки.

RUN echo "[repo] \
name            = YUM Repository \
baseurl         = https://example.com/packages/ \
enabled         = 1 \
gpgcheck        = 0" > /etc/yum.repos.d/Repo.repoxyz

Я знаю, что \ в конце каждой строки выходит за пределы новой строки. Но есть ли способ, которым я могу написать несколько строк, сохраняя новую строку?

4b9b3361

Ответ 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