← Назад к вопросам

Какие команды используются в Dockerfile?

1.3 Junior🔥 221 комментариев
#DevOps и инфраструктура

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Команды в Dockerfile

Dockerfile содержит специальные команды для создания Docker образов. Вот основные команды, которые должен знать каждый Python разработчик:

Базовые команды

FROM

Определяет базовый образ для контейнера:

FROM python:3.11-slim
FROM ubuntu:22.04
FROM alpine:latest

Это первая команда в Dockerfile. Все остальные команды строятся на этой основе.

RUN

Выполняет команды внутри контейнера при создании образа:

RUN apt-get update && apt-get install -y curl
RUN pip install --upgrade pip
RUN python -m pip install fastapi uvicorn

Рекомендуется объединять команды через && чтобы уменьшить количество слоёв.

COPY vs ADD

Копируют файлы с хоста в контейнер:

# COPY — предпочтительный вариант
COPY requirements.txt /app/

# ADD — более сложный, может распаковывать архивы
ADD source.tar.gz /app/

WORKDIR

Устанавливает рабочую директорию в контейнере:

WORKDIR /app
# Все команды будут выполняться из /app
RUN pip install -r requirements.txt
COPY . .

Команды для конфигурации

ENV

Устанавливает переменные окружения:

ENV PYTHONUNBUFFERED=1
ENV DATABASE_URL=postgresql://localhost/db
ENV DEBUG=false

ARG

Переменные сборки (доступны только при сборке):

ARG PYTHON_VERSION=3.11
FROM python:${PYTHON_VERSION}-slim

ARG BUILD_DATE
ARG VERSION=1.0

EXPOSE

Объявляет порт (документация, не открывает реально):

EXPOSE 8000
EXPOSE 5432

Команды запуска

CMD

Команда по умолчанию при запуске контейнера:

# Exec form (рекомендуется)
CMD ["python", "app.py"]

# Shell form
CMD python app.py

ENTRYPOINT

Точка входа (может быть переопределена):

ENTRYPOINT ["python", "-m", "uvicorn"]
CMD ["main:app", "--host", "0.0.0.0"]

# При запуске: docker run image --reload
# Результат: python -m uvicorn main:app --host 0.0.0.0 --reload

Продвинутые команды

VOLUME

Указывает директории для хранения данных:

VOLUME /data
VOLUME ["/var/log", "/var/db"]

USER

Запускает контейнер от определённого пользователя:

RUN useradd -m appuser
USER appuser

Никогда не запускай контейнеры от root!

LABEL

Добавляет метаданные:

LABEL version="1.0"
LABEL description="Python FastAPI application"
LABEL maintainer="dev@example.com"

HEALTHCHECK

Проверка здоровья контейнера:

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

Пример production Dockerfile для Python

# Stage 1: Builder
FROM python:3.11-slim as builder

WORKDIR /build
COPY requirements.txt .
RUN pip install --user --no-cache-dir -r requirements.txt

# Stage 2: Runtime
FROM python:3.11-slim

WORKDIR /app
ENV PYTHONUNBUFFERED=1

# Копируем зависимости из builder
COPY --from=builder /root/.local /root/.local
ENV PATH=/root/.local/bin:$PATH

# Копируем код
COPY . .

# Создаём непривилегированного пользователя
RUN useradd -m appuser
USER appuser

EXPOSE 8000
HEALTHCHECK --interval=30s CMD curl -f http://localhost:8000/health || exit 1

CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

Порядок команд в Dockerfile

Оптимальный порядок для кеширования слоёв:

FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .      # Копируем зависимости первыми
RUN pip install -r requirements.txt
COPY . .                      # Копируем код последним (часто меняется)
CMD ["python", "main.py"]

Практические советы

  • Используй .dockerignore чтобы исключить ненужные файлы
  • Multi-stage builds уменьшают размер образа
  • Группируй RUN команды через && и \
  • Помещай часто меняющиеся слои в конец
  • Избегай root пользователя — используй USER
  • Используй alpine или slim образы для меньшего размера
  • HEALTHCHECK помогает Kubernetes и Docker Swarm

Вывод: эти команды — основной инструмент для containerization Python приложений и необходимы для работы с Docker в production.