конечно, есть несколько способов сделать это;большинство ваших вызовов близки, но если вы выполните docker с -t
, он выделит терминал для ввода / вывода, что будет мешать операциям потока.
Мой недавний вызов из истории оболочки был:
docker exec -i mysql mysql -t < t.sql
в моем случае, конечно, mysql
- это имя работающего контейнера.Вы заметите, что я не передаю -t
docker exec
- я, тем не менее, передаю его в программу командной строки mysql
, которую я исполняю на хосте докера, так что не запутайтесьтам.
Оболочка, которая интерпретирует эту команду и выполняет Docker, также является той, которая открывает t.sql
и перенаправляет этот дескриптор файла на стандартный вывод docker
, поэтому t.sql
находится в текущем рабочем каталогеоболочки хоста, а не оболочки контейнера.
Это было сказано, вот почему ваш не сработал.Во-первых, как я уже сказал, использование exec -it
выделяет терминал, который мешает потоку stdin, настроенному оболочкой bash из cat
.Во-вторых, вы действительно близки, но path / file.sql не было в образе докера, поэтому я предполагаю, что выбрано «нет такого файла или каталога», потому что file.sql
находится на хосте, а неконтейнер, но в параметре -c
он ссылается на выполнение контейнера sh
.Конечно, для этого также необходимо удалить -t
;ни в том, ни в другом случае не нужно выделять терминал (у вас его уже есть, и он уже будет stdout для выполнения докера, поскольку он унаследует не перенаправленный stdout оболочки).