Количество команд в Dockerfile

Я заметил, что каждая строка в файле Dockerfile создает отдельное изображение. Существует ли ограничение на количество создаваемых изображений?

Если мы попытаемся сделать oneliner RUN cmd1 && cmd2 && cmd3 вместо?

Как это будет отличаться, если мы используем сервис наподобие Quay?

Спасибо!

Ответы

Ответ 1

Как Alister сказал, существует верхний предел количества слоев в изображении Docker, если вы используете файловую систему AUFS. В версии Docker 0.7.2 предел был увеличен до 127 уровней (changelog).

Поскольку это ограничение основной файловой системы союза (в случае AUFS), использование Quay или других частных реестров не изменит результат. Но вы можете использовать другую файловую систему.

Текущая альтернативная файловая система должна использовать devicemapper (см. Документы CLI). Эти другие файловые системы могут иметь разные ограничения на количество слоев - я не думаю, что devicemapper имеет верхний предел.

Вы правы, выполнив несколько команд в одном заявлении RUN, вы можете уменьшить количество слоев.

В качестве альтернативы, если вам действительно нужно много слоев для создания изображения, вы можете создать изображение, пока оно не достигнет максимума, а затем используйте docker export, чтобы создать неровную копию файловой системы изображения. Затем docker import снова верните его в изображение, на этот раз с одним слоем и продолжите строительство. Тем не менее вы теряете историю.

Ответ 2

Существует предел, равный 42 - по-видимому, жесткий предел, наложенный AUFS.

Этого можно избежать, добавив то, что было бы сделано в отдельных командах RUN, в script, а затем запустив script. Тогда у вас будет один, более крупный слой изображения, а не несколько небольших файлов для слияния. Меньшие изображения (с несколькими линиями RUN) облегчают первоначальное тестирование (поскольку новое дополнение в конце RUNlist может повторно использовать предыдущее изображение), поэтому типично ждать, пока ваш файл Docker не стабилизируется до слияния строк.

Вы также можете уменьшить потенциальное количество изображений при ADD количестве файлов, добавив полный каталог, а не несколько отдельных файлов.