Справочник по созданию образов 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
).