Вопрос или проблема
Вот команда, вывод которой я пытаюсь перенаправить:
$ docker exec -it container sh -c 'mongorestore --archive' < ~/db.dump
Я пытался просто сделать:
$ docker exec -it container sh -c 'mongorestore --archive' < ~/db.dump > restore.log
Я уверен, что есть форумы, которые показывают, как это сделать, но я даже не был уверен, как загуглить то, что я хочу сделать. Буду признателен за любую помощь.
Вы должны сделать перенаправление внутри команды sh -c
.
docker exec -it container sh -c 'mongorestore --archive < /db.dump > /restore.log 2>&1'
Использование 2>&1
перенаправляет стандартный вывод ошибок в стандартный вывод, так что оба захватываются в лог-файл.
Уберите -t
. Это говорит Docker открыть виртуальный терминал и подключить его к вводу и выводу выполняемого процесса, что мешает перенаправлению. Вам это нужно только тогда, когда вы хотите взаимодействовать с процессом, используя функции терминала.
Это должно сработать:
docker exec -i container sh -c 'mongorestore --archive' < ~/db.dump > restore.log
-i
по-прежнему нужен, так как вам нужно, чтобы ввод выполняемого процесса был подключен к перенаправленному вводу команды docker.
Ответ или решение
Чтобы перенаправить вывод команды mongorestore
в файл журнала при использовании Docker, вам нужно учесть несколько важных моментов. В этом ответе мы разберем, как правильно настроить перенаправление вывода, чтобы все операции записывались в указанный вами файл.
Шаги для перенаправления вывода
1. Используйте правильные параметры Docker
Для выполнения команды в контейнере Docker, вам не нужно использовать флаг -t
(терминал), поскольку это может помешать перенаправлению вывода. Вместо этого достаточно использовать флаг -i
, чтобы обеспечить ввод данных в режиме интерактивного выполнения.
2. Перенаправление ввода и вывода
Команда mongorestore
требует входного потока данных — это дамп вашей базы данных. Вместе с этим, вам нужно будет перенаправить как стандартный вывод, так и стандартный вывод ошибок в файл журнала.
Ваша команда должна выглядеть следующим образом:
docker exec -i container sh -c 'mongorestore --archive < /db.dump > /restore.log 2>&1'
Объяснение команд
-
docker exec -i container
: Эта часть командной строки запускает команду в указанном контейнере без создания терминала. -
sh -c
: Этот параметр запускает команду в оболочкеsh
, что позволяет использовать сложные конструкции, такие как перенаправление. -
'mongorestore --archive < /db.dump > /restore.log 2>&1'
: Внутри этой строки:mongorestore --archive < /db.dump
: Выполняет восстановление из дампа.> /restore.log
: Перенаправляет стандартный вывод в файлrestore.log
.2>&1
: Перенаправляет стандартный поток ошибок (stderr) в стандартный поток вывода (stdout), обеспечивая запись всех сообщений — как успешных, так и ошибок — в один файл.
Рекомендации
-
Проверьте наличие файла дампа: Убедитесь, что файл
db.dump
доступен в контейнере. Путь к файлу должен быть относителен к файловой системе контейнера. -
Права доступа: Убедитесь, что у вас есть права на запись в файл
restore.log
в контейнере. Если требуется, вы можете использовать полные пути для указания места сохранения журнала. -
Просмотр результатов: Чтобы убедиться, что все прошло успешно, проверьте содержимое
restore.log
после выполнения команды с помощью:docker exec -i container cat /restore.log
Эти шаги должны помочь вам успешно перенаправить вывод команды mongorestore
в файл журналов, обеспечивая при этом полный контроль над процессом восстановления данных.