Основные инструкции 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 задаёт переменные окружения.
Проверьте себя
1. В чём разница между RUN и CMD?
ARUN выполняется при запуске контейнера, CMD при сборке
BRUN выполняется при сборке образа, CMD при запуске контейнера
CЭто полные синонимы
DRUN можно указать только один раз, CMD — много раз
2. Что делает инструкция EXPOSE?
AОткрывает порт наружу автоматически
BДокументирует, какой порт слушает приложение, но сам порт не публикует
CЗапускает контейнер на указанном порту
DСкачивает образ с нужного порта
3. Какая инструкция обязательно стоит первой в Dockerfile?
ARUN
BFROM
CCMD
DWORKDIR
Поддержать проект