11 советов, как научиться лучшему и написать свой первый Dockerfile

Оглавление

Совет № 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 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.

Рекомендации