Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不同容器上的Python子进程';贝壳_Python_Docker_Docker Compose_Subprocess_Postgis - Fatal编程技术网

不同容器上的Python子进程';贝壳

不同容器上的Python子进程';贝壳,python,docker,docker-compose,subprocess,postgis,Python,Docker,Docker Compose,Subprocess,Postgis,我有一个docker compose体系结构,带有API(python)和其他特定服务的容器。其中一个容器是我想从API容器调用的PostGIS图像:其中一个端点应该触发PostGIS容器中的raster2pgsql命令,以便将光栅上载到我的数据库。我一直在使用python子流程在API容器中利用它,但我不知道如何使用它在postgis容器中执行命令。想法 版本:“3” 服务: 邮政地理信息系统: 图片:geographica/postgis:dev_diplodocus_光栅 端口: - "5

我有一个docker compose体系结构,带有API(python)和其他特定服务的容器。其中一个容器是我想从API容器调用的PostGIS图像:其中一个端点应该触发PostGIS容器中的
raster2pgsql
命令,以便将光栅上载到我的数据库。我一直在使用python子流程在API容器中利用它,但我不知道如何使用它在postgis容器中执行命令。想法

版本:“3”
服务:
邮政地理信息系统:
图片:geographica/postgis:dev_diplodocus_光栅
端口:
- "5432:5432"
卷数:
-数据库数据:/data
-/数据:/data/mydata
环境文件:
-./环境
链接:
-原料药
取决于:
-原料药
命令:tail-F/dev/null
应用程序编程接口:
建造:
上下文:./app
环境文件:&envfile
-./环境
卷数:
-.:/code/
端口:
- '8000:8000'
命令:api
卷数:
数据库数据:
我通常会这么做

docker exec postgis bash
>>>raster2pgsql[…]
如何使用python子流程从
api
容器调用它

导入操作系统
导入子流程
导入系统
从pathlib导入路径
def upload_raster():
subprocess.run(
['raster2pgsql',…],
shell=True,
超时=10000,
检查=正确,
stdin=子流程.PIPE,
stderr=subprocess.STDOUT,
)
打印('数据已上载')
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
光栅()

谢谢

您必须在容器之间创建一个桥接网络,并使用
ssh
在另一个容器中运行该命令

所以你的docker就变成了

postgis:
    ...
    networks:
        dockernet

api:
    ... 
    networks:
        dockernet

...
volumes:
   db-data:

networks:
    dockernet:
       driver: bridge   

确保在postgis容器上也设置了ssh服务器,以使其正常工作

能否在此过程中使用某种适当的网络API(例如,Flask服务器)?或者,您可以在与网络服务相同的容器中而不是在数据库容器中运行子流程吗?像
docker exec
这样的调试命令很难从容器内部运行,而且还有真正的安全问题。@DavidMaze这确实是我的首选选项。在我看来,这意味着将postgres+postgis安装在API容器本身中,并摆脱
postgis
容器?唯一的问题是如何在Dockerfile中正确安装,我猜它只是写出一个SQL查询作为其输出。没有理由需要在数据库容器中运行它。文档中甚至有一个例子,将其输出管道化到
psql
中,与一个可以在单独容器中运行PostGIS的数据库进行对话。这是正确的,我就是这样使用它的。但是我仍然需要调用
raster2pgsql
,以获得SQL语句。这就是为什么我猜测我需要在API容器中安装postgis,以便获得SQL命令。。。