一尘不染

ECONNREFUSED用于带有docker的nodeJS上的Postgres

docker

我正在构建一个使用postgresql在NodeJS上运行的应用程序。我正在将SequelizeJS用作ORM。为了避免使用真正的postgres守护程序并在自己的设备上安装nodejs,我使用了带有docker-
compose的容器。

当我运行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

有人可以帮我吗?

(喜欢docker的人:))


阅读 304

收藏
2020-06-17

共1个答案

一尘不染

DATABASE_URL所指的127.0.0.1回送适配器(更多信息请参见)。这意味着“连接到我自己”。

在同一主机上运行两个应用程序(不使用Docker)时,它们都可以在同一适配器(也称为localhost)上寻址。

在容器中运行两个应用程序时,它们与以前不在本地主机上。相反,您需要将web容器指向适配器db上容器的IP地址docker0- docker- compose为您设置。

更改:

DATABASE_URL: postgres://username:pgpassword@127.0.0.1:5432/mydatabase

DATABASE_URL: postgres://username:pgpassword@db:5432/mydatabase

多亏了Docker链接,该方法才能起作用:该web容器具有一个文件(/etc/hosts),其中的db条目指向该db容器所在的IP
。这是系统(在本例中为容器)在尝试解析主机名时首先会看到的位置。

2020-06-17