Справочник по созданию образов Docker

Полный справочник по Dockerfile и сборке образов

В этом руководстве рассмотрим:

  • Синтаксис Dockerfile
  • Основные директивы
  • Оптимизация сборки
  • Команды для работы с образами

1. Структура Dockerfile

Файл Dockerfile — это инструкция для сборки Docker-образа.

Пример минимального Dockerfile

# Базовый образ
FROM ubuntu:22.04

# Установка зависимостей
RUN apt-get update && apt-get install -y curl

# Копирование файлов в образ
COPY ./app /app

# Рабочая директория
WORKDIR /app

# Команда запуска контейнера
CMD ["python", "app.py"]

2. Основные директивы

Директива Описание Пример
FROM Базовый образ FROM python:3.9
RUN Выполнить команду при сборке RUN apt-get update
COPY Копировать файлы в образ COPY ./src /app
ADD Аналог COPY, но с распаковкой архивов и поддержкой URL ADD https://example.com/file.tar.gz /tmp
WORKDIR Установить рабочую директорию WORKDIR /app
ENV Установить переменную окружения ENV NODE_ENV=production
ARG Переменная, используемая только при сборке ARG VERSION=1.0
EXPOSE Объявить порт (не пробрасывает его!) EXPOSE 80
CMD Команда по умолчанию при запуске CMD ["npm", "start"]
ENTRYPOINT Основная команда контейнера ENTRYPOINT ["/app/start.sh"]
VOLUME Создать точку монтирования VOLUME /data
USER Задать пользователя USER nobody
HEALTHCHECK Проверка здоровья контейнера HEALTHCHECK --interval=30s CMD curl -f http://localhost/health

3. Оптимизация сборки

Многоступенчатая сборка (Multi-stage Build)

Уменьшает размер финального образа.

# 1. Этап сборки
FROM node:18 AS builder
WORKDIR /app
COPY . .
RUN npm install && npm run build

# 2. Финальный образ
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html

Кэширование слоев

  • COPY и ADD инвалидируют кэш, если файлы меняются.
  • RUN кэшируется, если команда не менялась.

Совет: Меняющиеся команды (apt-get update) размещайте в начале.


4. Сборка и управление образами

Сборка образа

docker build -t myapp:latest .
  • -t — задать имя и тег (name:tag)
  • . — путь к Dockerfile

Сборка с аргументами

ARG VERSION=1.0
ENV APP_VERSION=$VERSION
docker build --build-arg VERSION=2.0 -t myapp:2.0 .

Просмотр истории образа

docker history myapp:latest

Экспорт/импорт образа

docker save myapp:latest > myapp.tar
docker load < myapp.tar

5. Продвинутые техники

.dockerignore

Исключает файлы из копирования (аналог .gitignore):

node_modules/
*.log
.git/

Динамический CMD/ENTRYPOINT

ENTRYPOINT ["/app/start.sh"]
CMD ["--port=8080"]

Запуск с переопределением:

docker run myapp --port=3000

Health Check

HEALTHCHECK --interval=5s --timeout=3s \
  CMD curl -f http://localhost/ || exit 1

6. Примеры для разных языков

Python (FastAPI)

FROM python:3.9
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["uvicorn", "app:app", "--host", "0.0.0.0"]

Node.js

FROM node:18
WORKDIR /app
COPY package*.json ./
RUN npm ci --production
COPY . .
CMD ["npm", "start"]

Go

FROM golang:1.20 AS builder
WORKDIR /app
COPY . .
RUN go build -o /app/main .

FROM alpine:latest
COPY --from=builder /app/main /main
CMD ["/main"]

7. Полезные команды

Команда Описание
docker buildx build --platform linux/amd64,linux/arm64 -t myapp:multiarch . Сборка мультиархитектурного образа
docker scan myapp:latest Проверка на уязвимости (Snyk)
docker image prune -a Удалить неиспользуемые образы

Итог:

  • Используйте многоступенчатую сборку для оптимизации.
  • Минимизируйте количество слоев (объединяйте RUN).
  • Применяйте .dockerignore, чтобы ускорить сборку.
  • Для продакшена указывайте конкретные версии (python:3.9, а не python:latest).