11 советов, как научиться лучшему и написать свой первый Dockerfile
Оглавление
- Совет № 1: изучите базовую лексику Docker 📚
- Совет №2: узнайте, как собрать образ с помощью Dockerfile
- Совет №3: Сохраните файл Docker в корне контекста
- Совет №4: Начните с пустой директории
- Совет №5:ознакомьтесь с форматом Dockerfile
- Совет №6: Думайте, что инструкции не зависят друг от друга
- Совет № 7: посетите страницу Docker Hub, чтобы выбрать правильный вариант образа
- Совет №8: Используйте .dockerignore
- Совет № 9: Дайте имя и, возможно, тег своему изображению
- Совет №10: поймите, как работает Docker Daemon
- Совет №11: По возможности используйте build-cache
Совет № 1. Изучите базовую лексику Docker 📚
A Dockerfile
: набор инструкций, которые Docker читает и использует для создания образа. Это простотекстовый документ, в котором хранятся все команды, которые вы вызовете в командной строке для создания изображения.
Каталог context
: набор файлов по указанному адресу PATH или URL.
ПУТЬ указывает на локальный каталог на вашем компьютере. URL-адрес указывает на расположение репозитория Git. Примечание: контекст сборки обрабатывается рекурсивно. Это означает, что при заданном пути или URL будут обработаны все подкаталоги.
Команда docker build
: команда, используемая для создания образа. Ему нужно Dockerfile
context
.
Совет № 2: узнайте, как создать образ с помощью Dockerfile
Чтобы создать автоматическую сборку, вы можете использовать docker build <context>
.
Мы видели, как контекст может быть локальным путем или URL-адресом git. Если вы хотите использовать локальный текущий каталог в качестве контекста сборки, вам просто нужно использовать .
Как только вы выполните команду docker build <context>
, она сначала отправит весь контекст (рекурсивно) демону Docker. Действительно, журнал, который вы увидите после выполнения команды сборки, выглядит следующим образом:
$ docker build . Sending build context to Docker daemon 6.51 MB
Совет №3: Сохраните файл Docker в корне контекста
Стандартной практикой является сохранение Dockerfile
в корне контекста. Однако, если вам нужно изменить это местоположение, вы можете указать новый путь с флагом -f
. Например: docker build -f /path/to/a/Dockerfile
.
Совет № 4: Начните с пустого каталога
Поскольку все содержимое контекста отправляется демону Docker, лучше всего начать с пустого каталога в качестве контекста только с Dockerfile. Затем вы можете добавить файлы, необходимые для сборки Dockerfile.
⛔️ Никогда не используйте корневой каталог в качестве ПУТИ, так как это приведет к передаче всего жесткого диска демону Docker.
Совет № 5: Разберитесь с форматом Dockerfile
Dockerfile
не чувствителен к регистру. Однако рекомендуется писать инструкции с заглавной буквы, чтобы их было легче отличить от аргументов.
Dockerfile
должен начинаться с инструкции FROM
. Единственные вещи, которые могут предшествовать инструкциям FROM
, это:
- Комментарии: строки, начинающиеся с
#
(если они не являются директивой синтаксического анализатора). - Директивы парсера.
- Аргументы глобального масштаба (когда объявленные аргументы используются в инструкции
FROM
).
Инструкция FROM
указывает родительский образ, из которого вы строите. Все последующие команды основаны на этом родительском образе.
Пример:
FROM python:3.7
Dockerfile с директивой FROM scratch
не использует родительский образ и создает базовый образ.
Формат Dockerfile
должен быть следующим:
# Comment INSTRUCTION arguments
Строки комментариев удаляются перед выполнением инструкций Docker. Это означает, что вы можете написать:
RUN echo hello \ # comment world
or
RUN echo hello \ world
эквивалентны.
Совет № 6: Думайте, что инструкции не зависят друг от друга
Демон Docker выполняет инструкцию Dockerfile
одну за другой. Это означает, что RUN cd /tmp
не влияет на следующие инструкции.
Совет № 7. Посетите страницу Docker Hub, чтобы выбрать правильный вариант образа
Иногда изображения бывают разных видов, каждый из которых предназначен для конкретного случая использования.
Например, образ Python Docker имеет вид python:<version>
, python:<version>-slim
, python:<version>-alpine
, python:<version>-windowsservercore
. В нижней части страницы вы найдете описание всех различных тегов.
Если вы не уверены, используйте стандартный вариант, например python:<version>
.
В общем, вы должны знать, что Debian и Alpine — это две разновидности Linux. Образы Docker могут быть основаны на одном или другом. Тот, который вы выберете, зависит от ваших требований.
Эти сообщения могут помочь: Разница между образами Docker на основе Alpine и Debian, или Сравнение Debian и Alpine для контейнеров и приложений Docker, 3 самых больших преимущества при использовании Alpine в качестве базового образа Docker.
Я также нашел познавательной эту статью: Alpine, Slim, Stretch, Buster, Jessie, Bullseye — в чем разница в образах Docker?
Совет № 8: Используйте .dockerignore
Вы можете добавить файл .dockerignore
в каталог контекста, чтобы исключить определенные файлы и каталоги. Это повысит производительность сборки, поскольку в противном случае Docker будет рассматривать все файлы/каталоги, указанные в данной инструкции. Например, COPY .
скопирует все содержимое текущего каталога, но, скорее всего, не все файлы/каталоги нужны для сборки образа Docker.
Совет № 9: Дайте имя и, при желании, тег своему изображению.
Одна из наиболее часто используемых опций для docker build
— использовать --tag
или -t
для добавления имени и, возможно, тега к изображению в формате name:tag
. Имя изображения состоит из компонентов имени, разделенных косой чертой.
Пример: docker build -t view/apache:2.0 .
сохранит изображение в репозиторий view/apache
(это также имя изображения) с тегом 2.0
.
Если вы не укажете какой-либо тег, Docker автоматически назначит latest
.
По умолчанию Docker сохраняет образы в общедоступном реестре, расположенном по адресу registry-1.docker.io
. Если вы хотите использовать имя хоста частного реестра, вы можете сделать это при условии, что имя хоста соответствует стандартным правилам DNS и не содержит символов подчеркивания. Кроме того, вы также можете указать номер порта в формате :8080
.
Пример: docker build -t myregistryhist:5000/fedora/httpd:version1.0
отправляет образ в частный реестр в репозиторий fedora
с этапом version1.0
.
Вы также можете использовать параметр -t
несколько раз, чтобы пометить изображение в несколько репозиториев.
Пример: docker build -t shykes/myapp:1.0.2 -t shykes/myapp:latest
Совет № 10: поймите, как работает Docker Daemon
Демон Docker отвечает за запуск сборки (это не CLI). Процесс сборки состоит из 4 основных этапов:
- Шаг 1: все содержимое каталога контекста отправляется демону Docker.
- Шаг 2: демон Docker выполняет инструкции в файле Docker одну за другой и фиксирует результат каждой инструкции в новом образе.
- Шаг 3: демон Docker выводит идентификатор нового образа.
- Шаг 4: демон Docker автоматически очищает отправленный вами контекст.
Совет № 11: по возможности используйте build-cache
Кэширование значительно ускорит процесс сборки. Если что-то кэшируется, вы должны увидеть сообщение CACHE в выводе консоли.
По умолчанию. кэш сборки основан на результатах предыдущих сборок, которые были созданы на машине, которую вы сейчас собираете. Если вам нужен внешний кэш сборки, вы можете использовать опцию --cache-from
.
Рекомендации
- Ссылка на файл Docker: https://docs.docker.com/engine/reference/builder/#run