使用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主机名时的第一个地方。