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

Приведи примеры команд Docker файла

2.0 Middle🔥 131 комментариев
#Другое

Комментарии (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 использования.