Я учусь с контейнерами докеров, и я хотел бы передать файл .sql в базу данных с помощью docker exec. Как я могу это сделать? Я ищу около часа и нашел это:
cat file.sql | docker exec -it mariadb sh -c 'mysql -u<user> -p<pass>'
или это
docker exec -it mariadb sh -c 'mysql -u<user> -p<pass> "$(< /path/file.sql)"'
но ничего из этого не сработало. Я думаю, проблема заключается в том, что я передаю его в sh -c, и он пытается загрузить этот файл изнутри контейнера. Как мне это сделать?





конечно, есть несколько способов сделать это; большинство ваших вызовов близки, но если вы запустите докер с -t, он выделит терминал для ввода-вывода, и это будет мешать операциям потока.
Мой недавний вызов из истории оболочки:
docker exec -i mysql mysql -t < t.sql
в моем случае, конечно, mysql - это имя работающего контейнера. Вы заметите, что я нет передаю -t в docker exec - однако я передаю его программе командной строки mysql, которую я выполняю на хосте докера, так что не запутайтесь.
Оболочка, которая интерпретирует эту команду и выполняет докер, также открывает t.sql и перенаправляет этот файловый дескриптор на стандартный ввод docker, поэтому t.sql здесь находится в текущем рабочем каталоге оболочки хоста, а не в оболочке контейнера.
Как уже было сказано, вот почему ваша не сработала. Во-первых, как я уже сказал, использование exec -it выделяет терминал, который мешает потоку stdin, который оболочка bash настроила из cat. Во-вторых, вы действительно близки, но путь / file.sql не был в образе докера, поэтому я предполагаю, что это вызвало сообщение «нет такого файла или каталога», потому что file.sql находится на хосте, а не в контейнере, тем не менее, в параметре -c он ссылается на выполнение контейнера sh. Конечно, для этого также потребуется удалить -t; ни в том, ни в другом случае не нужно выделять терминал (он у вас уже есть, и он уже будет стандартным выводом для выполнения докера, поскольку он унаследует не перенаправленный стандартный вывод оболочки).
Привет, Дэн, возможно ли одновременное перенаправление файлов и работу терминала? Скажем, если базе данных нужно использовать пароль для входа в систему, и мы не хотим вводить пароль в интерфейсе командной строки, например docker exec -i something mysql -u root -proot, а используем docker exec -it something mysql -u root -p, а затем вводим пароль. После этого используйте файловый ввод < t.sql. Обычно это похоже на «Отложить перенаправление после того, как мы сделаем какое-то взаимодействие», возможно ли это? Большое спасибо за продвижение!
Я не знаю такого способа изменить входной поток для запущенного процесса с терминала в файл. Я предлагаю вам поместить пароль mysql в ~ / .my.cnf, который для вас будет /root/.my.cnf.
Stack Overflow - это сайт для вопросов по программированию и разработке. Для этого вопроса вам следует использовать другой сайт в Сеть обмена стеками.