Сценарий:
У меня есть контейнер postgres с именем db
, работающий на машине.Я нахожусь в каталоге на хосте и у меня есть сценарий SQL с именем patch.sql
.Я хотел бы применить этот сценарий к базе данных внутри контейнера.
Если бы я был внутри контейнера и имел сценарий также внутри контейнера, я бы запустил
psql -U user -d db -f patch.sql
Так как явне контейнера я наивно мог бы попытаться
docker exec -i db psql -U user -d db -f patch.sql
, но, конечно, для этого нужно было бы найти файл с именем patch.sql
внутри контейнера, в то время как он фактически находится на хост-компьютере.
Мой текущий обходной путь -
cat patch.sql | docker exec -i db /bin/sh -c "cat $@ > patch.sql"
docker exec -i db psql -U user -d db -f patch.sql
docker exec -i db rm patch.sql
Можно ли элегантно уменьшить это до однострочного?
Я знаю, как разместить файл внутри контейнера, это именно то, что мойобходной путь делает.Я подумываю о некоторой хитрости с перенаправлением ввода-вывода для помещения файла в команду.
Я не хочу монтировать тома и не могу этого сделать, так как контейнер уже работает в любом случае.Идея состоит в том, чтобы избежать перемещения файла в контейнер.