从Docker容器中运行psql命令

3
我在使用docker-compose连接PostgresDB到我的应用程序时遇到了困难。
我对docker compose的理解是,我可以将两个容器组合在一起,以便它们可以相互通信。假设我有一个位于“app”容器中的应用程序,该应用程序运行psql命令(只是一个带有“os.command(“psql”)”的单行Python脚本)。由于“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'

app容器内部,你应该能够通过telnet postgres9 5432进行连接。你得到了什么? - undefined
2个回答

3
每个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 Pipfilesetup.py和/或requirements.txt中添加一个标准的Python PostgreSQL客户端库,例如psycopg2,并使用该库而不是调用psql。你还需要安装PostgreSQL C库头文件来安装该软件包;与其安装postgresql-client,不如安装Debian libpq-dev软件包。

1
在您的情况下,那两个包含每个postgres实例的容器正在不同的主机上运行(不是具有 app 的主机)。您需要在 psql 命令中指定正确的主机。它可能看起来像这样(对于postgres12容器):
PGPASSWORD="mysecretpassword" psql -h postgres12 -d test_bd -U postgres

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接