【发布时间】: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