我正在使用postgresql在NodeJS上构建一个应用程序。我使用SequelizeJS作为ORM。为了避免使用真正的postgres守护进程,并在我自己的设备上使用nodejs,我使用了带有docker编写的容器。
当我运行docker-compose up
时,它将启动pg数据库
database system is ready to accept connections
和nodejs服务器。但是服务器无法连接到数据库。
Error: connect ECONNREFUSED 127.0.01:5432
如果我试图在不使用容器的情况下运行服务器(在我的机器上有真正的nodejs和postgresd ),它就能工作。
但我希望它能和容器一起正常工作。我不明白我做错了什么。
这是docker-compose.yml
文件
web:
image: node
command: npm start
ports:
- "8000:4242"
links:
- db
working_dir: /src
environment:
SEQ_DB: mydatabase
SEQ_USER: username
SEQ_PW: pgpassword
PORT: 4242
DATABASE_URL: postgres://username:pgpassword@127.0.0.1:5432/mydatabase
volumes:
- ./:/src
db:
image: postgres
ports:
- "5432:5432"
environment:
POSTGRES_USER: username
POSTGRES_PASSWORD: pgpassword
有人能帮帮我吗?
(喜欢码头的人:)
发布于 2015-10-27 09:06:18
您的DATABASE_URL
指的是127.0.0.1
,它是回送适配器 (更多的这里)。这意味着“连接到我自己”。
当在同一个主机上运行两个应用程序(不使用Docker)时,它们都可以在同一个适配器(也称为localhost
)上寻址。
当在容器中运行这两个应用程序时,它们不像以前一样都在本地主机上。相反,您需要将web
容器指向docker0
适配器上的db
容器的IP地址-- docker-compose
为您设置这个地址。
更改:
从127.0.0.1
到CONTAINER_NAME
(例如db
)
示例:
DATABASE_URL: postgres://username:pgpassword@127.0.0.1:5432/mydatabase
至
DATABASE_URL: postgres://username:pgpassword@db:5432/mydatabase
这要归功于Docker链接:web
容器有一个文件(/etc/hosts
),其中有一个指向db
容器所在IP的db
条目。在试图解析主机名时,这是系统(在本例中是容器)首先要查看的地方。
发布于 2019-04-01 07:26:54
对于更多的读者,如果您使用的是Docker desktop for Mac
,请使用host.docker.internal
而不是文档中建议的localhost
或127.0.0.1
。我遇到了同样的connection refused...
问题。后端api-service
无法使用localhost/127.0.0.1
连接到postgres
。下面是我的docker-compose.yml和环境变量作为引用:
version: "2"
services:
api:
container_name: "be"
image: <image_name>:latest
ports:
- "8000:8000"
environment:
DB_HOST: host.docker.internal
DB_USER: <your_user>
DB_PASS: <your_pass>
networks:
- mynw
db:
container_name: "psql"
image: postgres
ports:
- "5432:5432"
environment:
POSTGRES_DB: <your_postgres_db_name>
POSTGRES_USER: <your_postgres_user>
POSTGRES_PASS: <your_postgres_pass>
volumes:
- ~/dbdata:/var/lib/postgresql/data
networks:
- mynw
发布于 2019-12-15 06:15:44
我有两个容器,一个是postgresdb,另一个是调用节点。
我将节点queries.js更改为:
const pool = new Pool({
user: 'postgres',
host: 'localhost',
database: 'users',
password: 'password',
port: 5432,
})
至
const pool = new Pool({
user: 'postgres',
host: 'postgresdb',
database: 'users',
password: 'password',
port: 5432,
})
我所要做的就是将主机更改为容器名"postgresdb“,这为我解决了这个问题。我相信这可以做得更好,但我只是在过去的两天里学到了码头撰写/ node.js的东西。
https://stackoverflow.com/questions/33357567
复制相似问题