Ответ
Для копирования файла (например, дампа базы данных или логов) из запущенного контейнера на хост используется команда docker cp.
Базовый синтаксис:
docker cp <container_name_or_id>:<path_inside_container> <path_on_host>
Практические примеры:
-
Копирование дампа 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 -
Прямое копирование без промежуточных команд в контейнере (если дамп уже существует):
docker cp mysql_container:/var/lib/mysql/backup/dump.sql ~/prod_backups/ -
Копирование целой директории (рекурсивно):
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