postgresql - 从 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'
解决方案
每个 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 Pipfile
、setup.py
和/或requirements.txt
,并使用该库而不是使用psql
. 您还需要 PostgreSQL C 库头文件来安装该软件包;而不是postgresql-client
,安装 Debianlibpq-dev
软件包。
推荐阅读
- javascript - 反应更新组件问题
- powershell - 使用 Invoke-Command 执行 PowerShell 远程会话无效
- ios - 使用 UIButton 扩展 UITextView 而不是根据内容自动扩展
- javascript - jquery显示和隐藏功能
- java - 如何按特定顺序验证字符串中的字符?
- c# - 2个指向同一张表的外键
- rows - 使用 SSN 查询 3 个不同的表
- vba - VBA“科学”非标准数字格式
- ms-access - MS Access 菜鸟 - 在更新记录之前要求确认
- reactjs - 如何清除 Redux 中一个对象的值,而不清除其他对象的值?