Как скопировать файлы и директории в Docker-образ

Ответ

Для копирования локальных файлов и директорий в Docker-образ используются инструкции `COPY` и `ADD` в `Dockerfile`. Инструкция `COPY` является предпочтительной в большинстве случаев из-за своей предсказуемости и прозрачности. **Пример с `COPY`:** ```dockerfile # Указываем базовый образ FROM python:3.9-slim # Устанавливаем рабочую директорию внутри контейнера WORKDIR /app # Копируем содержимое локальной директории ./src # в рабочую директорию /app контейнера COPY ./src /app # Копируем отдельный файл COPY requirements.txt . CMD ["python", "main.py"] ``` ### Разница между `COPY` и `ADD` | Инструкция | Возможности | | :--- | :--- | | **`COPY`** | Копирует файлы и директории из контекста сборки в файловую систему образа. | | **`ADD`** | Делает то же, что и `COPY`, но дополнительно умеет:
  • Скачивать файлы по URL.
  • Автоматически распаковывать локальные `.tar` архивы.
| **Рекомендация (Best Practice):** Используйте `COPY` по умолчанию. Он более предсказуем. Применяйте `ADD` только тогда, когда вам действительно нужна его дополнительная функциональность (например, автоматическая распаковка архива).

Ответ 18+ 🔞

Давайте разберем эту вашу хрень с копированием файлов в Docker, а то некоторые тут, как обезьяны с гранатой, лезут в Dockerfile без понятия.

Вот смотрите, есть две главные инструкции — COPY и ADD. И если вы не хотите потом охуеть от того, что у вас в образе творится, запомните раз и навсегда: используйте COPY. Это как молоток — простой, понятный, по пальцам себе не прибьёшь.

ADD — это уже такой швейцарский нож с хитрыми лезвиями, которые сами выскакивают. Он тоже файлы копирует, но ещё может из интернета что-то скачать и архивы распаковать. Звучит круто? А нахуй оно надо, если вы этого не просили? Оно возьмёт и начнёт творить какую-то свою магию, а вы потом будете чесать репу, откуда в /app лишние файлы взялись.

Вот вам каноничный пример, как надо:

# Берём нормальный, не раздутый образ
FROM python:3.9-slim

# Говорим, где внутри контейнера будем работать
WORKDIR /app

# КОПИРУЕМ, блядь, а не добавляем! Всё из папки ./src — в /app
COPY ./src /app

# И отдельно requirements.txt тащим
COPY requirements.txt .

# А дальше уже свои команды...
CMD ["python", "main.py"]

Краткая памятка, чтобы не ебать мозг:

  • COPY — тупо берёт файлы с вашего компа и кладёт их в образ. Всё. Прозрачно, как слёзы ребёнка. Используйте всегда, если не знаете, что делать.
  • ADD — делает то же самое, но если ему дать архив (.tar, .gz), он его распакует, а если дать ссылку — попробует скачать. Это как дать обезьяне банан и отвертку — результат непредсказуем.

Вывод, ёпта, простой: если вам не нужно специально распаковывать архив прямо в Dockerfileзабейте на ADD и используйте COPY. И ваша сборка перестанет быть лотереей, в которой вы каждый раз с замиранием сердца ждёте, что же на этот раз наворотил этот ёбаный ADD.