Рекомендации
Для того чтобы использовать образы эффективнее, необходимо следовать рекомендациям от команды Docker:
- Нужно создавать образы так, чтобы жизненным циклом контейнера можно было удобно управлять. Образ не должен хранить внутреннее состояние. Данные внутрь образа можно передать на этапе сборки с помощью аргументов командной строки, а на этапе работы контейнера можно пользоваться томами Docker.
- Необходимо понимать контекст запуска веб-приложения: папка проекта, удалённый ресурс (remote source) или репозиторий.
- Надо понимать, что
Dockerfileможет запускаться вне контекста через стандартный поток ввода. - Используйте файл
.dockerignoreдля того, чтобы в образ попадали только нужные файлы и папки. От всего лишнего лучше избавиться на этапе сборки. - Используйте сборку приложения в несколько стадий. Это позволит существенно уменьшить размер образа.
- Не устанавливайте то, что не будете использовать в образе.
- Необходимо разделять приложения на обособленные части, которые способны выполняться независимо. Этот процесс носит название декаплинга (Decoupling).
- Минимизируйте количество слоёв в образе. Это повышает производительность образа как при сборке, так и при работе контейнера.
- Если параметры инструкции записываются в несколько строк (с помощью символа переноса строки
\) необходимо выстраивать аргументы в алфавитном порядке. Это повышает читаемость файла и упрощает отладку. - Используйте кэш Docker только для тех слоёв, которые будут нужны для сборки других образов. Для этого достаточно добавить параметр
--no-cache=trueв команду сборкиdocker build.
Сборка образа
Образ Docker можно собрать тремя способами:
– указав путь к папке PATH;
– указав путь к репозиторию URL;
– используя стандартный поток ввода –.
Чаще всего используется первый способ с указанием пути. Самая простая команда для сборки образа:
docker build .
С помощью этой команды собираться образ будет из текущей папки (. в конце), в которой должен быть Dockerfile.
Использование нескольких Dockerfile
Иногда возникает необходимость использования нескольких вариантов сборок в одном проекте. В этом случае не обойтись без нескольких файлов с инструкциями. При сборке можно указать другое имя для файла конфигурации или относительный путь внутри PATH, нужно использовать флаг -f:
docker build -f containers/dockerfile-mode-1 .
Точно так же можно указать относительный путь для проекта или репозитория по некоторому URL. Например, Docker может скачать не только репозиторий GitHub, но и произвольный архив с проектом, распаковать его и собрать образ:
docker build -f ctx/Dockerfile http://server/ctx.tar.gz
Поддерживаются архивы форматов bzip2, gzip, xz.
Файлы и папки проекта, исполняемый файл приложения, архив или репозиторий Git составляют контекст образа. Но Docker позволяет собирать образы без контекста, из стандартного потока ввода. Собрать такой образ можно командой:
docker build - < Dockerfile
Исключение файлов из сборки .dockerignore
Если вам не нужно включать в образ какие-то папки или файлы из контекста, добавьте в папку файл исключений .dockerignore. В этом файле перечисляются в отдельных строках все пути или маски путей, которые не должны быть помещены в образ. Пример файла:
# Комментарий
*/temp*
*/*/temp*
temp?
– */temp позволяет не включать в образ файлы или папки, имена которых начинаются на temp, и которые находятся в любой папке первого уровня (например, /somedir/temporary.txt или /somedir/temp);
– */*/temp* — делает то же, но для папок второго уровня;
– temp? — позволяет не включать в образ файлы и папки из корневой папки образа, имена которых начинаются на temp и состоят из пяти символов, последний из которых может быть любым.