【问题标题】:Problems with running PostgresSQL together with node/express in Docker. FATAL: no PostgreSQL user name specified in startup packet在 Docker 中与 node/express 一起运行 PostgresSQL 的问题。致命:启动数据包中未指定 PostgreSQL 用户名
【发布时间】:2021-06-15 17:07:34
【问题描述】:

我正在尝试在 Docker 中运行开发环境。

我有一个docker-compose 文件,其中包含 4 个服务:前端、postgres、pgadmin4 和 node/express。如果我在本地运行 Docker 和 Express 中的 postgres,我可以连接到数据库。如果我尝试在 Docker 中运行 Express 和 Postgres,Express 正在工作,我也可以通过 pgadmin4 连接到 postgres,但我得到:

FATAL: no PostgreSQL user name specified in startup packet

当我尝试连接到数据库的端点时。

在 Google 中搜索后,我认为这与由于某种原因未正确设置环境变量有关。我对主机名如何工作以及在哪里使用什么主机名有点困惑?我的机器的主机名?本地主机?码头服务的名称?无论如何,这是我的配置:

docker-compose.yml

version: '3'
services:
  frontend:
    build: ./frontend/
    command: npm run start
    volumes:
      - ./frontend/:/usr/app/
      - ./frontend/node_modules
    ports:
      - '3000:3000'
 
  db:
    image: postgres
    ports:
      - '5432:5432'
    environment:
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=password
      - POSTGRES_DB=exampledb
 
  db_admin:
    image: dpage/pgadmin4
    ports:
      - '5555:80'
    environment:
      - PGADMIN_DEFAULT_EMAIL=asdf
      - PGADMIN_DEFAULT_PASSWORD=asdf
    depends_on:
      - db
 
  api:
    build: ./backend/api/
    command: npm run dev
    volumes:
      - ./backend/api/:/usr/app/
      - /backend/api/node_modules
    ports:
      - '3333:3333'
    depends_on:
      - db

连接到 postgres 的 JS 代码

const { Pool } = require('pg')

const client = new Pool({
    host: 'db',
    port: '5432',
    username: 'user',
    password: 'password',
    database: 'exampledb'
  })

module.exports = {
  query: (text, params) => client.query(text, params),
}

谢谢!

【问题讨论】:

  • 在数据库初始化之前,前端服务可能正在运行。尝试使用 Dockerfile 中的 dockerize 等待数据库准备就绪。见:github.com/jwilder/dockerize#waiting-for-other-dependencies
  • @DonnyVerduijn 我不认为是这样。目前不涉及前端,我只是通过浏览器中的端点测试数据库。如果我等待一个小时让它启动也没关系。
  • 对不起,我的意思是你的 api 服务。您的 api 服务不会等待您的 db 服务准备好。在 docker-compose 文件中使用 depends_on 或 links 只会强制执行服务的启动顺序,但服务不会等待内部的实际应用程序准备好。
  • 我认为您在设置环境变量时不应该使用=。您应该改用:。看看一些例子here。
  • @abhishek_naik 尝试将版本设置为 3.1 并使用与这些示例中相同的语法。仍然得到同样的错误。 db_1 | 2019-11-18 18:40:43.269 UTC [68] 致命:启动数据包 api_1 中未指定 PostgreSQL 用户名 |错误:启动包中没有指定 PostgreSQL 用户名

标签: javascript postgresql docker express docker-compose


【解决方案1】:

在您的池连接上,它应该是这样的:


const client = new Pool({
    host: 'db',
    port: '5432',
    user: 'user',
    password: 'password',
    database: 'exampledb'
})

module.exports = {
    query: (text, params) => client.query(text, params),
}

将 username 更改为 user 作为您的密钥,您应该是金色的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-04
    • 2020-07-31
    • 1970-01-01
    • 2021-09-26
    • 2022-10-15
    • 2022-10-05
    • 1970-01-01
    • 2018-01-18
    相关资源
    最近更新 更多