2015-10-26 33 views
16

我正在使用postgresql構建在NodeJS上運行的應用程序。 我使用SequelizeJS作爲ORM。 爲了避免使用真正的postgres守護進程並在我自己的設備上使用nodejs,我使用了docker-compose的容器。ECONNREFUSED在nodeJS上使用docker的Postgres

當我運行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:[email protected]:5432/mydatabase 
    volumes: 
    - ./:/src 
db: 
    image: postgres 
    ports: 
    - "5432:5432" 
    environment: 
    POSTGRES_USER: username 
    POSTGRES_PASSWORD: pgpassword 

有人能幫助我嗎?

(有人誰喜歡搬運工:))

+0

這篇文章提到「boot2docker ip」命令,在這裏似乎有用嗎? https://www.andreagrandi.it/2015/02/21/how-to-create-a-docker-image-for-postgresql-and-persist-data/ –

+0

似乎有什麼區別,你的主機操作系統你在 –

回答

25

DATABASE_URL127.0.0.1,這是loopback adapter(更多here)。這意味着「連接到我自己」。

在同一主機上運行這兩個應用程序(不使用Docker)時,它們都可在同一個適配器(也稱爲localhost)上尋址。

當兩個應用程序在容器中運行時,它們都不像以前一樣位於本地主機上。相反,您需要將web容器指向docker0適配器上的db容器的IP地址 - 其中docker-compose爲您設置。

變化:

DATABASE_URL: postgres://username:[email protected]:5432/mydatabase 

DATABASE_URL: postgres://username:[email protected]:5432/mydatabase 

這個工程由於碼頭工人鏈接:在web容器有一個文件(/etc/hosts)與db條目指向IP的db容器上。這是系統(在這種情況下,容器)嘗試解析主機名時的第一個地方。

+2

謝謝安迪,這是我正在尋求。祝你今天愉快 ! – Stainz42

+0

我是一個noob /初學者與postgres /節點。我到底需要做什麼改變? – nerdess

+0

@nerdess'DATABASE_URL'在問題的'docker-compose.yml'中 - 這就是需要改變的地方。你可以在你的應用程序代碼中用'process.env ['DATABASE_URL']'引用它。 – Andy