Какие команды используются в Dockerfile?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Команды в 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.