bash - 如何将本地文件作为参数注入(inject)到在 docker 容器中运行的命令?

标签 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 重定向将文件放入命令中的一些技巧。

我不想挂载卷,我不能这样做,因为容器已经在运行。这个想法是避免将文件移动到容器中。

最佳答案

也许可以尝试直接管道 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

关于bash - 如何将本地文件作为参数注入(inject)到在 docker 容器中运行的命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54589130/

相关文章:

docker - 在 Docker 中创建 Jenkins 的卷备份

bash - Bash 条件句中感叹号是在括号内还是在括号外有关系吗?

bash - 为什么 "24 > 10#24"会生成错误 token ?

linux - 从 bash 切换到 csh 提示符

linux - Bash - 如何使用 printf 打印多行字符串(带有 '\n' )

docker - 无法在Docker容器中使用 `systemd-cat`

linux - 如何在 Linux 上使用 bash 增加文本文件中的浮点值?

sql-server - Bak 文件备份还原 M1 Apple 中的 Docker Azure SQL Edge

networking - 如何从主机上的浏览器连接到 docker 容器?

docker - Visual Studio 2022 无法在 docker 上启动应用程序