Передать содержимое файла в docker exec

Я учусь с контейнерами докеров, и я хотел бы передать файл .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, и он пытается загрузить этот файл изнутри контейнера. Как мне это сделать?

Stack Overflow - это сайт для вопросов по программированию и разработке. Для этого вопроса вам следует использовать другой сайт в Сеть обмена стеками.

jww 28.12.2018 15:32
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
13
1
6 181
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

конечно, есть несколько способов сделать это; большинство ваших вызовов близки, но если вы запустите докер с -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. Обычно это похоже на «Отложить перенаправление после того, как мы сделаем какое-то взаимодействие», возможно ли это? Большое спасибо за продвижение!

cyl19910101 11.02.2019 04:20

Я не знаю такого способа изменить входной поток для запущенного процесса с терминала в файл. Я предлагаю вам поместить пароль mysql в ~ / .my.cnf, который для вас будет /root/.my.cnf.

Daniel Farrell 26.03.2019 17:10

Другие вопросы по теме