首页 > 解决方案 > 从 docker 容器运行 psql 命令

问题描述

我无法使用将 postgresDB 连接到我的应用程序docker-compose

我对 docker compose 的理解是,我可以将两个容器组合起来,这样它们就可以相互通信了。假设我在app容器中有一个运行 psql 命令的应用程序(只是一个带有 的单行 python 脚本os.command("psql"))。由于app容器没有安装 postgres,它不能自己运行 psql。但是,我认为在 docker-compose.yml 中组合两个容器可以让我运行 psql,但显然不是。

我在这里想念什么?

我正在使用 2 个 postgres 图像,因为我试图在两个 dbms 之间找到回归错误

version: "3"
services:
    app:
        image: "app:1.0"
        depends_on: 
            - postgres9
            - postgres12
        ports:
            - 8080:80 
    postgres9:
        image: postgres:9.6
        environment:
            POSTGRES_PASSWORD: mysecretpassword
            POSTGRES_USER: postgres
            POSTGRES_DB: test_bd
        ports:
            - '5432:5432'
    postgres12:
        image: postgres:12
        environment:
            POSTGRES_PASSWORD: mysecretpassword
            POSTGRES_USER: postgres
            POSTGRES_DB: test_bd
        ports:
            - '5435:5435'

标签: postgresqldockerdocker-composepsql

解决方案


每个 Docker 容器都有一个独立的文件系统。您永远不能直接从主机或其他容器的文件系统运行命令;您想要运行的任何东西都需要安装在容器中(实际上,在其映像的 Dockerfile 中)。

如果您想运行类似的工具psql,则需要将其安装在您的映像中。你没有说你的基础镜像是什么,但如果它基于 Debian 或 Ubuntu,你需要安装postgresql-client包:

RUN apt-get update \
 && DEBIAN_FRONTEND=noninteractive \
    apt-get install --no-install-recommends --assume-yes \
      postgresql-client

此处正确的方法是将标准 Python PostgreSQL 客户端库(如psycopg2)添加到项目的 Python Pipfilesetup.py和/或requirements.txt,并使用该库而不是使用psql. 您还需要 PostgreSQL C 库头文件来安装该软件包;而不是postgresql-client,安装 Debianlibpq-dev软件包。


推荐阅读