从docker容器运行psql命令



我在使用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'

每个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(添加到项目的PythonPipfilesetup.py和/或requirements.txt中,并使用该库,而不是扩展到psql。您还需要PostgreSQL C库头文件来安装该包;安装Debianlibpq-dev软件包而不是postgresql-client

在您的案例中,这两个容器中都有postgres实例,它们在不同的主机上运行(除了具有app的主机(。您需要的是在psql命令中指定正确的主机。它可能看起来像(对于postgres12容器(:

PGPASSWORD="mysecretpassword" psql -h postgres12 -d test_bd -U postgres

最新更新