场景:
我有一个运行在机器上的名为db
的postgres容器。我在主机上的目录中,并且有一个名为patch.sql
的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
是否有办法将其优雅地减少为单线?
我知道,如何将文件放置在容器中,这正是我的解决方法。我正在考虑将I / O重定向用于将文件放入命令中的一些技巧。
我不想挂载卷,而且我不能这样做,因为容器已经在运行了。这样做的目的是避免将文件移到容器中。
答案 0 :(得分:1)
也许可以尝试直接将patch.sql
文件内容通过管道传输到psql,例如
cat patch.sql | docker exec -i db psql -U user -d db -f -
或者只是
cat patch.sql | docker exec -i db psql -U user -d db