我有两个 docker 容器,一个使用 Apache(+ PHP),另一个使用 PostgreSQL(+ PostGIS,PostgreSQL 数据库的空间扩展)。
PostGIS 有一个二进制文件 (shp2pgsql) 可以在 SQL 指令中转换 shapefile 数据。当我需要这样做时,我运行以下命令:
/usr/bin/shp2pgsql {...arguments...} filename.shp > insql.sql
在特定情况下,当用户上传shapefile时(在apache+php容器中),我需要在PostgreSQL+PostGIS容器中运行shp2pgsql。
我已经试过了:
将 docker 守护进程暴露给 Apache docker 容器并使用 docker exec 命令调用二进制 shp2pgsql,但没有成功,因为 apache 用户(调用 docker exec 的人)没有权限。
将卷“/usr/bin/”从 PostgreSQL 容器共享到 Apache 容器,但没有成功,因为二进制文件 (shp2pgsql) 与其他库(在其他文件夹中)有依赖关系。
<
是否有一种优雅(或不)可行的方法来做到这一点? 这个问题还有其他替代方案吗?
我们非常欢迎任何建议或想法。
最佳答案
不是很优雅,绝对不安全,但解决方案是在不同的新 postgres 容器中调用 shp2pgsql
。来自 apache 容器。类似于 this thread 中描述的内容.
另一个选择是 go micro-service-y 并创建一个新的图像,该图像将基于 postgres 图像并包含一个简单的脚本或二进制文件,该脚本或二进制文件将公开 shp2pgsql
的执行结果通过一些(REST?)接口(interface),这将依次由 apache/php 流式传输。这假定您只需要 shp2pgsql
二进制文件及其依赖项,而不需要 postgres 数据。否则,您可以将此自定义服务放入与原始数据库相同的容器中,即使这违反了 docker 对每个容器一个进程的偏好。
第三种方法实际上是将所需的二进制文件安装到 apache 容器中。
同样,这两种解决方案对我来说都不是很优雅,让我们看看是否有人提供了更好的解决方案。
关于php - Docker 容器从另一个容器调用二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34021182/