Dockerfile: сборка образа контейнера
Коротко: Dockerfile — это текстовый файл с шагами, по которым Docker собирает образ, шаблон для контейнеров.
Подробнее: Образ содержит программу, среду выполнения и зависимости; из него запускаются контейнеры. Dockerfile описывает, как создаётся образ, команда за командой. Каждая команда создаёт слой, который кэшируется, так что при пересборке заново создаются только изменённые слои.
Подробности
Пример для приложения Node.js
FROM node:22-alpine # базовый образ
WORKDIR /app # рабочий каталог
COPY package*.json ./ # сначала только списки пакетов
RUN npm ci --omit=dev # установить зависимости
COPY . . # затем скопировать остальное
EXPOSE 3000 # заметка о порте
USER node # не запускать от root
CMD ["node", "server.js"] # команда запускаСборка и запуск:
docker build -t my-app:1.0 .
docker run -p 3000:3000 my-app:1.0
Важные инструкции
FROM: базовый образ (как можно меньше и с фиксированной версией).RUN: выполнить команду во время сборки.COPY/ADD: скопировать файлы внутрь (предпочитайтеCOPY).ENV,ARG: переменные.CMD,ENTRYPOINT: команда при запуске контейнера.HEALTHCHECK: проверяет, работает ли приложение.
Хорошая практика
- Используйте порядок: редко меняющееся (зависимости) сначала, исходный код последним, чтобы работал кэш.
.dockerignoreкак.gitignore: не кладитеnode_modules,.git, секреты в образ.- Многоэтапная сборка (multi-stage): собирайте на одном этапе, копируйте только результат в тонкий конечный образ.
- Не запускайте от root, поддерживайте базовый образ в актуальном состоянии и проверяйте на уязвимости (
docker scout, Trivy). - Никаких паролей в Dockerfile: они остаются видны в слоях.
Пример многоэтапной сборки
FROM golang:1.23 AS build
WORKDIR /src
COPY . .
RUN CGO_ENABLED=0 go build -o /app
FROM gcr.io/distroless/static
COPY --from=build /app /app
CMD ["/app"]Конечный образ содержит только готовую программу, а не компилятор, и поэтому мал и менее уязвим для атак.
См. также: Docker, Безопасность контейнеров, Podman и Docker, Переменные окружения