如何将本地文件作为在Docker容器中运行的命令的参数注入?

时间:2019-02-08 09:13:46

标签: bash docker

场景:

我有一个运行在机器上的名为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重定向用于将文件放入命令中的一些技巧。

我不想挂载卷,而且我不能这样做,因为容器已经在运行了。这样做的目的是避免将文件移到容器中。

1 个答案:

答案 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