如何在 docker 中连接到 postgresql

问题描述

我在我的机器上的 docker 容器中运行了一个 postgresql 数据库。我用这个运行命令启动它。

docker run -p 5432:5432 -d \
-e POSTGRES_PASSWORD=$PG_PASS \
-e POSTGRES_USER=$PG_USER \
-e POSTGRES_DB=$PG_NAME \
-v pgdata:/var/lib/postgresql/data \
--name $PG_CONTAINER_NAME \
postgres:alpine

我已经通过运行 pgadmin4 容器并使用其容器名称连接到该容器来确认这使用环境变量创建了数据库

现在我正在尝试将我的 express 应用程序连接到数据库。我正在使用名为 mikroorm 的 orm。 ts 代码

const orm = await MikroORM.init({
    dbname: 'ketopal',user: 'ketopaladmin',password: 'ketopaladmin',type: 'postgresql',debug: !__prod__,entities: [Post],host: '172.17.0.2',port: 5432
})

这会产生一行错误

MikroORM 无法连接到 postgresql://ketopaladmin:*****@172.17.0.2:5432 上的数据库 ketopal

但我不知道为什么或如何解决它。 172.17.0.2是docker给容器的IP。

在我的完美世界中,你们都可以告诉我如何让 docker 使 localhost:5432 指向 docker 容器,但任何帮助将不胜感激。

解决方法

我想我会在这里记录以防万一有人也遇到了这个问题。我有一个本地 postgres 进程在端口 5432 上运行,所以当我尝试将容器“发布”到同一个端口时,它没有这样做,即使它创建了容器并且正在工作。我调整了运行命令,将端口 54321 映射到 5432。

docker run -p 54321:5432 -d \
-e POSTGRES_PASSWORD=$PG_PASS \
-e POSTGRES_USER=$PG_USER \
-e POSTGRES_DB=$PG_NAME \
-v pgdata:/var/lib/postgresql/data \
--name $PG_CONTAINER_NAME \
postgres:alpine

TLDR;如果您正在运行的东西已经声明了一个端口,那么在该端口上运行容器将不起作用。