【问题标题】:Python subprocess on a different container's shell不同容器外壳上的 Python 子进程
【发布时间】: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


【解决方案1】:

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

所以你的 docker compose 变成了

postgis:
    ...
    networks:
        dockernet

api:
    ... 
    networks:
        dockernet

...
volumes:
   db-data:

networks:
    dockernet:
       driver: bridge   

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    • 2015-07-22
    • 2013-01-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    相关资源
    最近更新 更多