【发布时间】:2021-03-01 08:11:42
【问题描述】:
我有一个 docker-compose 架构,带有一个 API (python) 和其他用于特定服务的容器。其中一个容器是我想从我的 API 容器调用的 PostGIS 图像:其中一个端点应该在 postgis 容器中触发 raster2pgsql 命令,以便将栅格上传到我的数据库。我一直在使用 python 子进程在 API 容器中利用它,但我不知道如何使用它在 postgis 容器中执行命令。想法?
version: "3"
services:
postgis:
image: geographica/postgis:dev_diplodocus_raster
ports:
- "5432:5432"
volumes:
- db-data:/data
- ./data:/data/mydata
env_file:
- ./.env
links:
- api
depends_on:
- api
command: tail -F /dev/null
api:
build:
context: ./app
env_file: &envfile
- ./.env
volumes:
- .:/code/
ports:
- '8000:8000'
command: api
volumes:
db-data:
我通常会这样做
docker exec postgis bash
>>> raster2pgsql [...]
如何使用python子进程从api容器中调用它?
import os
import subprocess
import sys
from pathlib import Path
def upload_raster():
subprocess.run(
['raster2pgsql', ...],
shell=True,
timeout=10000,
check=True,
stdin=subprocess.PIPE,
stderr=subprocess.STDOUT,
)
print('Data has been uploaded')
if __name__ == '__main__':
raster()
谢谢!
【问题讨论】:
-
你能在这个过程周围放置一些适当的网络 API(例如,一个 Flask 服务器)吗?或者,您可以在与网络服务相同的容器中而不是在数据库容器中运行子进程吗?像
docker exec这样的调试命令很难在容器内部运行,而且还存在真正的安全问题。 -
@DavidMaze 这确实是我的首选。正如我所看到的,这意味着在 API 容器本身中安装 postgres + postgis,并摆脱
postgis容器?我猜唯一的问题是在 Dockerfile 中正确安装 -
它 looks like
raster2pgsql只是写出一个 SQL 查询作为它的输出。它没有理由需要在数据库容器中运行。该文档甚至有一个示例,将其输出通过管道传输到psql以与数据库进行对话,该数据库可适用于在单独的容器中运行 PostGIS。 -
没错,我就是这么用的。但是我仍然需要调用
raster2pgsql来获取SQL 语句。这就是为什么我猜我需要在 API 容器中安装 postgis 才能获得 SQL 命令...
标签: python docker docker-compose subprocess postgis