Ответ
Dockerfile — это текстовый документ, содержащий все команды, которые Docker Engine должен выполнить для сборки образа. Каждая инструкция создает новый слой в образе, что важно для оптимизации кэширования и размера образа.
Основные инструкции Dockerfile:
-
FROM <image>[:<tag>]:- Назначение: Определяет базовый образ, на основе которого будет строиться ваш образ. Это обязательная и первая инструкция в любом Dockerfile.
- Почему: Устанавливает начальное состояние образа, включая операционную систему и предустановленное ПО.
- Пример:
FROM python:3.9-slim-buster
-
RUN <command>:- Назначение: Выполняет команды в новой оболочке внутри образа во время его сборки.
- Почему: Используется для установки пакетов, компиляции кода, создания директорий и других подготовительных шагов, необходимых для работы приложения.
- Пример:
RUN apt-get update && apt-get install -y build-essential
-
COPY <src> <dest>:- Назначение: Копирует файлы или директории с хост-машины (контекста сборки) в файловую систему образа.
- Почему: Используется для добавления исходного кода, конфигурационных файлов и других ресурсов приложения в образ. Предпочтительнее
ADDдля простых копирований. - Пример:
COPY ./app /app
-
WORKDIR <path>:- Назначение: Устанавливает рабочую директорию для всех последующих инструкций
RUN,CMD,ENTRYPOINT,COPY,ADD. - Почему: Упрощает пути к файлам и командам, делая Dockerfile более читаемым и поддерживаемым.
- Пример:
WORKDIR /app
- Назначение: Устанавливает рабочую директорию для всех последующих инструкций
-
ENV <key>=<value>:- Назначение: Устанавливает переменные окружения, которые будут доступны внутри контейнера во время сборки и выполнения.
- Почему: Используется для конфигурации приложения, например, для указания портов, баз данных или режимов работы.
- Пример:
ENV PORT=8000
-
EXPOSE <port> [<port>...]:- Назначение: Информирует Docker, что контейнер будет слушать на указанных сетевых портах во время выполнения.
- Почему: Это документация для пользователя образа и не публикует порт автоматически. Для публикации порта используется флаг
-pпри запуске контейнера (docker run -p 8000:8000 ...). - Пример:
EXPOSE 8000
-
CMD ["executable", "param1", "param2"](exec form) илиCMD command param1 param2(shell form):- Назначение: Определяет команду по умолчанию, которая будет выполнена при запуске контейнера.
- Почему: Если пользователь запускает контейнер без указания команды, будет выполнена
CMD. В Dockerfile может быть только одна инструкцияCMD. ЕслиCMDуказан вместе сENTRYPOINT, он служит аргументами дляENTRYPOINT. - Пример:
CMD ["python", "app.py"]
-
ENTRYPOINT ["executable", "param1", "param2"](exec form) илиENTRYPOINT command param1 param2(shell form):- Назначение: Настраивает контейнер как исполняемый файл.
- Почему: Используется для создания исполняемых образов, где контейнер всегда выполняет одну и ту же команду, а
CMDпредоставляет аргументы по умолчанию для этой команды. - Пример:
ENTRYPOINT ["gunicorn", "app:app", "--bind", "0.0.0.0:8000"]
Пример Dockerfile:
FROM python:3.9-slim-buster
WORKDIR /app
# Копируем файл зависимостей и устанавливаем их
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Копируем остальной код приложения
COPY . .
# Объявляем порт, на котором будет слушать приложение
EXPOSE 8000
# Команда для запуска приложения при старте контейнера
CMD ["python", "app.py"]