Как вытянуть дамп (файл) из контейнера Docker на хостовую машину?

«Как вытянуть дамп (файл) из контейнера Docker на хостовую машину?» — вопрос из категории Docker, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для копирования файла (например, дампа базы данных или логов) из запущенного контейнера на хост используется команда docker cp.

Базовый синтаксис:

docker cp <container_name_or_id>:<path_inside_container> <path_on_host>

Практические примеры:

  1. Копирование дампа PostgreSQL из контейнера:

    # Создаём дамп внутри контейнера
    docker exec postgres_db pg_dump -U postgres mydb > /tmp/dump.sql
    # Копируем готовый файл на хост
    docker cp postgres_db:/tmp/dump.sql ./backups/postgres_dump_$(date +%Y%m%d).sql
    # Очищаем временный файл в контейнере
    docker exec postgres_db rm /tmp/dump.sql
  2. Прямое копирование без промежуточных команд в контейнере (если дамп уже существует):

    docker cp mysql_container:/var/lib/mysql/backup/dump.sql ~/prod_backups/
  3. Копирование целой директории (рекурсивно):

    docker cp app_container:/var/log/nginx/ ./container_logs/

Альтернативный метод: перенаправление вывода команды exec Удобно, когда нужно выполнить команду и сразу сохранить вывод на хосте, не создавая временный файл в контейнере.

# Дамп базы MySQL напрямую в файл на хосте
docker exec mysql_container mysqldump -u root --password=$DB_PASS production_db > ./backups/prod_dump.sql
# Экспорт коллекции MongoDB
docker exec mongo_container mongoexport --db mydb --collection users --jsonArray > users_backup.json

Важные замечания:

  • Команда docker cp работает только с запущенными контейнерами. Для остановленных контейнеров можно смонтировать том или использовать docker create и docker cp на созданном, но не запущенном контейнере.
  • Убедитесь, что на хосте есть права на запись в целевую директорию.
  • Для больших файлов можно использовать утилиту pv для визуализации прогресса:
    docker exec mysql_container cat /var/lib/mysql/large_dump.sql | pv > ./large_dump.sql