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

Какая команда может перенести в Docker image директорию с файлами?

2.2 Middle🔥 191 комментариев
#DevOps и инфраструктура

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

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

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

Команда для переноса директории в Docker image

В Dockerfile используется команда COPY (или ADD).

1. Основная команда COPY

# Синтаксис
COPY <source> <destination>

# Скопировать директорию
COPY ./my_app /app

# Скопировать все файлы текущей директории
COPY . /app

# Скопировать с переименованием
COPY ./src /application

Пример полного Dockerfile:

FROM python:3.11-slim

WORKDIR /app

# Скопировать все файлы проекта
COPY . /app

# Или скопировать директорию
COPY ./backend /app/backend
COPY ./frontend /app/frontend

RUN pip install -r requirements.txt

CMD ["python", "main.py"]

2. COPY vs ADD

# COPY — базовое копирование
COPY requirements.txt /app/

# ADD — умнее: может распаковать архивы
ADD my_archive.tar.gz /app/
ADD https://example.com/file.tar.gz /app/

Лучшая практика: используй COPY в 95% случаев, ADD только для архивов.

3. Копирование с сохранением прав доступа

# По умолчанию COPY сохраняет права
COPY --chown=root:root ./my_app /app
COPY --chown=1000:1000 ./config /etc/app/

# С правами 755
RUN chmod 755 /app/script.sh

4. Копирование условных файлов

# Скопировать только Python файлы
COPY *.py /app/

# Скопировать всё кроме исключённых (нужен .dockerignore)
COPY . /app

.dockerignore файл (как .gitignore):

__pycache__
*.pyc
.env
.git
node_modules
dist
build
*.log

5. Многоэтапная сборка (Multi-stage build)

# Stage 1: Build
FROM python:3.11 as builder
WORKDIR /build
COPY requirements.txt .
RUN pip install -r requirements.txt --target ./deps

# Stage 2: Runtime
FROM python:3.11-slim
WORKDIR /app
COPY --from=builder /build/deps /app/deps
COPY ./app /app/src
ENV PYTHONPATH=/app/deps:$PYTHONPATH
CMD ["python", "src/main.py"]

6. Копирование с поддиректориями

# Скопировать всё содержимое директории
COPY backend/ /app/backend/

# Скопировать с сохранением структуры
COPY ./src/config /app/src/config
COPY ./src/models /app/src/models

7. Практический пример для Python приложения

FROM python:3.11-slim

WORKDIR /app

# Копируем только requirements первым (для кеша)
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# Копируем исходный код
COPY ./src ./src
COPY ./config ./config
COPY main.py .

# Копируем данные
COPY ./data ./data

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

EXPOSE 8000
CMD ["python", "main.py"]

8. Проверка, что скопировалось

# Во время сборки используй RUN для проверки
RUN ls -la /app/

# В контейнере после запуска
docker run -it myimage ls -la /app/

9. FastAPI приложение

FROM python:3.11-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install -r requirements.txt

COPY ./app ./app
COPY ./migrations ./migrations
COPY alembic.ini .

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

10. Обычные ошибки

❌ Неправильно:

COPY /home/user/my_app /app  # Абсолютный путь в контексте
COPY my_app ./               # Не указана папка назначения

✅ Правильно:

COPY my_app /app        # Относительно контекста сборки
COPY my_app /app/       # Указана папка назначения

11. Часто используемые паттерны

Скопировать только production зависимости:

FROM python:3.11 as requirements
COPY requirements.txt .
RUN pip install pipdeptree && pipdeptree --warn fail

FROM python:3.11-slim
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . /app

Минимальный образ:

FROM python:3.11-alpine
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
CMD ["python", "main.py"]

Итог

  • COPY — копирует файлы/директории из хоста в контейнер
  • Синтаксис: COPY <source> <destination>
  • Контекст: пути относительны к контексту сборки (где находится Dockerfile)
  • Лучшая практика: копируй dependencies отдельно для кеширования слоёв
  • Исключения: используй .dockerignore для ускорения сборки