【问题标题】:How to connect to postgresql in docker如何在docker中连接到postgresql
【发布时间】:2021-04-20 12:23:55
【问题描述】:

我有一个在我机器上的 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 容器,但我们将不胜感激。

【问题讨论】:

  • 您的 express 应用可以在同一台机器上运行而不使用 docker?你试过写'localhost'而不是'172.17.0.2'吗?它应该与“localhost”参数一起使用,因为您已将 5432 端口从容器转发到主机上的 5432 端口
  • 由于localhost 表示主机,而不是容器,我建议在host 部分中使用container_name 而不是IP 地址。
  • 我将在帖子中添加一个编辑以澄清,我尝试不指定主机,使用 localhost 和 container_name,以及网桥的 ip 和 docker 容器的 ip。我很茫然。

标签: postgresql docker mikro-orm


【解决方案1】:

我想我会在这里记录以防有人也遇到这种情况。我在端口 5432 上运行了一个本地 postgres 进程,因此当我尝试将容器“发布”到同一个端口时,它没有这样做,即使它创建了容器并且在其他方​​面工作。我调整了运行命令,将端口 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;如果您正在运行的某些东西已经声明了一个端口,那么在该端口上运行一个容器将无法正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-29
    • 2018-12-01
    • 2017-12-03
    • 1970-01-01
    • 2017-03-16
    • 2022-01-25
    • 2021-06-11
    • 2019-09-28
    相关资源
    最近更新 更多