Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Основные команды Dockerfile и примеры
Dockerfile — это текстовый файл, содержащий инструкции для построения Docker образа. Каждая инструкция создает слой в образе. Рассмотрим основные команды и практические примеры.
1. FROM — базовый образ
# Стартуем с официального Python образа
FROM python:3.11-slim
# FROM должен быть первой инструкцией (или после ARG)
FROM ubuntu:22.04
FROM node:18-alpine
От базового образа наследуются все предустановленные пакеты и зависимости.
2. WORKDIR — рабочая директория
FROM python:3.11-slim
# Все последующие команды выполняются в этой директории
WORKDIR /app
# Эквивалентно: mkdir -p /app && cd /app
3. COPY / ADD — копирование файлов
FROM python:3.11-slim
WORKDIR /app
# COPY — копирует файлы с хоста в контейнер
COPY requirements.txt .
COPY . .
# ADD похож на COPY, но может распаковывать архивы
ADD app.tar.gz .
# Лучше использовать COPY (более явно и предсказуемо)
4. RUN — выполнение команд
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
# RUN выполняет команду в контейнере
RUN pip install --no-cache-dir -r requirements.txt
# Можно выполнять любые shell команды
RUN apt-get update && apt-get install -y curl
# Объединяй команды в один RUN для экономии слоев
RUN apt-get update && \
apt-get install -y curl && \
apt-get clean
5. ENV — переменные окружения
FROM python:3.11-slim
# Установка переменных окружения
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
ENV APP_ENV=production
# Доступны в контейнере
RUN echo $APP_ENV # Выведет: production
6. EXPOSE — открытые порты
FROM python:3.11-slim
# Документирует, какие порты слушает приложение
EXPOSE 8000
EXPOSE 5432
# Это только документация, не открывает порт
# Порт открывается при запуске: docker run -p 8000:8000
7. CMD — команда по умолчанию
FROM python:3.11-slim
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
# CMD — команда, которая выполняется при запуске контейнера
CMD ["python", "app.py"]
# Или в shell форме
CMD python app.py
8. ENTRYPOINT — точка входа
FROM python:3.11-slim
# ENTRYPOINT задает команду, которую нельзя переопределить
ENTRYPOINT ["python", "-m", "flask"]
CMD ["run"] # Аргумент по умолчанию
# При запуске: docker run app run
# Выполнит: python -m flask run
9. USER — пользователь контейнера
FROM python:3.11-slim
# Создаем пользователя для безопасности
RUN useradd -m appuser
# Переключаемся на этого пользователя
USER appuser
# Все последующие команды выполняются от appuser
WORKDIR /home/appuser/app
10. ARG — аргументы сборки
FROM python:3.11-slim
# ARG определяет переменные для сборки
ARG BUILD_DATE
ARG VERSION=1.0.0
LABEL build.date="${BUILD_DATE}"
LABEL version="${VERSION}"
# При сборке: docker build --build-arg VERSION=2.0.0 .
11. LABEL — метаданные образа
FROM python:3.11-slim
LABEL maintainer="team@company.com"
LABEL description="Flask API server"
LABEL version="1.0.0"
Полный пример: Python FastAPI приложение
# Многоэтапная сборка для оптимизации размера
# Этап 1: Сборка
FROM python:3.11-slim as builder
WORKDIR /app
COPY requirements.txt .
# Устанавливаем зависимости в виртуальное окружение
RUN python -m venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH"
RUN pip install --no-cache-dir -r requirements.txt
# Этап 2: Runtime
FROM python:3.11-slim
# Метаданные
LABEL maintainer="dev@company.com"
LABEL description="FastAPI application"
# Переменные окружения
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
ENV APP_ENV=production
# Создаем пользователя для безопасности
RUN useradd -m -u 1000 appuser
WORKDIR /app
# Копируем виртуальное окружение из builder
COPY --from=builder /opt/venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH"
# Копируем код приложения
COPY --chown=appuser:appuser . .
# Переключаемся на пользователя appuser
USER appuser
# Открываем порт
EXPOSE 8000
# Команда запуска
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
Пример: Django приложение с PostgreSQL
FROM python:3.11-slim
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
WORKDIR /app
# Устанавливаем системные зависимости
RUN apt-get update && apt-get install -y \
postgresql-client \
&& apt-get clean
# Копируем и устанавливаем Python зависимости
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Копируем код
COPY . .
# Создаем пользователя
RUN useradd -m appuser && chown -R appuser:appuser /app
USER appuser
EXPOSE 8000
# Запуск с gunicorn
CMD ["gunicorn", "config.wsgi:application", "--bind", "0.0.0.0:8000"]
Пример: Node.js приложение
FROM node:18-alpine
WORKDIR /app
# Копируем package files
COPY package*.json ./
# Устанавливаем зависимости
RUN npm ci --only=production
# Копируем исходный код
COPY . .
# Сборка (если используется)
RUN npm run build
EXPOSE 3000
CMD ["npm", "start"]
Best Practices для Dockerfile
# ✅ Хорошо: Использование легких базовых образов
FROM python:3.11-slim
# ✅ Хорошо: Объединение команд в один RUN
RUN apt-get update && apt-get install -y \
curl && apt-get clean
# ✅ Хорошо: Использование .dockerignore
# .dockerignore файл исключает ненужные файлы
# ✅ Хорошо: Многоэтапная сборка
FROM python as builder
# ... сборка
FROM python:slim
COPY --from=builder /app /app
# ✅ Хорошо: Кеширование слоев
# Копируй зависимости раньше кода
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
# ❌ Плохо: Большие базовые образы
FROM ubuntu:22.04 # 77 MB
FROM python:3.11 # 884 MB
# ❌ Плохо: Использование latest тега
FROM python:latest # Непредсказуемо
# ❌ Плохо: Запуск от root
USER root
RUN pip install package
# Должен быть USER appuser
# ❌ Плохо: Большие слои
RUN apt-get update
RUN apt-get install -y curl
RUN apt-get clean
# Объедини в один RUN
Команды для работы с Dockerfile
# Сборка образа
docker build -t my-app:1.0 .
# С аргументами сборки
docker build --build-arg VERSION=2.0 -t my-app:2.0 .
# Запуск контейнера
docker run -p 8000:8000 my-app:1.0
# Просмотр слоев образа
docker history my-app:1.0
# Просмотр размера образа
docker images my-app:1.0
Вывод
Dockerfile — это ключевой инструмент для контейнеризации приложений. Основные команды (FROM, WORKDIR, COPY, RUN, CMD, ENTRYPOINT) позволяют создавать эффективные и безопасные образы. Соблюдение best practices делает images меньше, быстрее и безопаснее для production использования.