Я хочу написать следующую команду RUN в Dockerfile. Но докер не сохраняет новые строки.
RUN echo "[repo] \
name = YUM Repository \
baseurl = https://example.com/packages/ \
enabled = 1 \
gpgcheck = 0" > /etc/yum.repos.d/Repo.repoxyz
Я знаю, что \
в конце каждой строки выходит новая строка. Но есть ли способ написать несколько строк, сохраняя новую строку?
docker
dockerfile
Венката Джасвант
источник
источник
Ответы:
Вы можете использовать так называемое "цитирование ANSI-C" с
$'...'
. Изначально это была функция ksh93, но теперь она доступна в bash, zsh, mksh, FreeBSD sh и в золе busybox (но только когда она скомпилирована с ENABLE_ASH_BASH_COMPAT).Поскольку RUN
/bin/sh
по умолчанию используется как оболочка вам необходимо сначала переключиться на что-то вроде bash, используя инструкцию SHELL.Начните свою команду с
$'
, завершите ее'
и используйте\n\
для новых строк, например:источник
$' ... \n\
метод зависит от оболочки, которуюRUN
использует dockerbash
. В некоторых системах (таких как Ubuntu) RUN использует оболочку,/bin/sh
которая часто является ссылкой наdash
которую НЕ являетсяbash
и не понимает$'
синтаксиса.Oh My Zsh
одном из них не работает )Я использовал
printf
. Запись всего текста в одну строку с использованием «\ n».Выполнение:
вставки:
в example.txt
источник
Вы можете использовать:
Таким образом, у вас будет быстрый способ проверить содержимое файла. Вам просто нужно знать, что вам нужно заканчивать каждую строку
\
и вставлять,\n
когда это необходимо.источник
echo -e
интерпретации\n
В итоге я использовал комбинацию примеров, перечисленных выше, поскольку новая строка
\n
не работалаecho
.Как и ожидалось, он производит следующее:
источник
Может быть, это вам поможет ( 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
источник
Вы можете выполнить RUN несколько раз, чтобы завершить свой файл:
Это может быть не оптимальным решением, поскольку оно создает новый уровень для каждой команды RUN. Тем не менее, каждый уровень будет такого же размера, как и внесенное вами изменение, которое в данном случае имеет порядок байтов (первый уровень RUN должен быть 7-байтовым).
Преимущество этого решения в том, что оно будет работать со всеми оболочками.
источник
&&
целью лучшего кэширования, уменьшения количества журналов и ускорения времениDockerfile
сборки