使用docker的nodeJS上的PostgreSQL的ECONNREFUSED

我正在使用postgresql构build在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的人:))

您的DATABASE_URL引用127.0.0.1 ,这是回送适配器 (更多在这里 )。 这意味着“连接到我自己”。

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

在容器中运行这两个应用程序时,它们都不像以前那样在本地主机上。 相反,您需要将web容器指向docker0适配器上的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。 这是系统(在这种情况下,容器)尝试parsing主机名时的第一个地方。

Interesting Posts