Основные инструкции Dockerfile
Разбираем по очереди главные инструкции Dockerfile: FROM, WORKDIR, COPY, RUN, CMD, EXPOSE, ENV.
Инструкция — команда Dockerfile, выполняемая при сборке образа; большинство инструкций создают новый слой.
FROM — базовый образ
Первая инструкция всегда FROM — она задаёт базовый образ, на котором всё строится. Берут официальный образ с нужным рантаймом:
FROM python:3.12-slim
Варианты -slim и -alpine заметно меньше полного образа — их предпочитают, чтобы уменьшить размер.
WORKDIR — рабочая директория
WORKDIR задаёт текущую папку внутри образа; все последующие COPY, RUN и CMD выполняются относительно неё. Если папки нет — она создаётся.
WORKDIR /app
COPY — копирование файлов
COPY ИСТОЧНИК НАЗНАЧЕНИЕ копирует файлы из контекста сборки (вашей папки) внутрь образа:
COPY requirements.txt .
COPY . .
RUN — выполнить при сборке
RUN выполняет команду во время сборки образа и сохраняет результат в новый слой. Типично — установка зависимостей:
RUN pip install -r requirements.txt
CMD — команда запуска контейнера
CMD задаёт команду, которая выполняется при запуске контейнера (а не при сборке). Предпочтительна форма-массив:
CMD ["python", "app.py"]
Важно не путать: RUN срабатывает один раз при сборке образа, CMD — каждый раз при старте контейнера. CMD в Dockerfile должна быть одна.
EXPOSE — документирование порта
EXPOSE сообщает, какой порт слушает приложение. Это документация: сам по себе порт наружу не открывается — для этого нужен -p при запуске.
EXPOSE 8000
ENV — переменные окружения
ENV задаёт переменные окружения внутри образа:
ENV APP_ENV=production
ENV PORT=8000
| Инструкция | Когда срабатывает | Назначение |
FROM | сборка | базовый образ |
WORKDIR | сборка | рабочая папка |
COPY | сборка | копировать файлы в образ |
RUN | сборка | выполнить команду (создаёт слой) |
CMD | запуск | команда старта контейнера |
EXPOSE | — | документирует порт |
ENV | сборка/запуск | переменная окружения |
Итог
FROMзадаёт базовый образ,WORKDIR— рабочую папку,COPYпереносит файлы.RUNвыполняется при сборке,CMD— при запуске контейнера.EXPOSEлишь документирует порт,ENVзадаёт переменные окружения.