2017-04-26 131 views
1

我有一個使用golang構建的web服務器。當我在本地測試它時,它工作正常。無法連接到來自Golang容器的Postgres docker容器

但是,當我爲我的Web服務器構建Docker鏡像時,它無法連接到正在運行的Postgres容器。

這裏是我的docker-compose.yml

version: '2' 
services: 
    go: 
     image: golang:1.7 
     volumes: 
      - ./:/server/http 
     ports: 
      - "80:8080" 
     links: 
      - postgres 
      - mongodb 
      - redis 
     environment: 
      DEBUG: 'true' 
      PORT: '8080' 

    postgres: 
     image: onjin/alpine-postgres:9.5 
     restart: unless-stopped 
     ports: 
      - "5432:5432" 
     environment: 
      LC_ALL: C.UTF-8 
      POSTGRES_USER: user 
      POSTGRES_PASSWORD: pass 
      POSTGRES_DB: mydb 
    mongodb: 
     image: mvertes/alpine-mongo:3.2.3 
     restart: unless-stopped 
     ports: 
      - "27017:27017" 

    redis: 
     image: sickp/alpine-redis:3.2.2 
     restart: unless-stopped 
     ports: 
      - "6379:6379" 

Dockerfile

FROM golang:1.7 

RUN mkdir -p /home/app 

WORKDIR /home/app 

COPY . /home/app 

RUN make deps && make 

ENTRYPOINT ["./bin/api-test"] 

EXPOSE 8080 

我使用的Postgres的連接字符串:

postgresql://user:[email protected]/mydb?sslmode=disable 

對於主機,我嘗試localhost並返回出現以下錯誤:

dial tcp [::1]:5432: getsockopt: connection refused 

嘗試postgres,它返回下列信息:

dial tcp 202.71.99.194:5432: getsockopt: connection refused 

試過IP地址,我得到運行此命令將返回172.19.0.3

docker inspect apitest_postgres_1 | grep IPAddress 

其中apitest_postgres_1是Postgres的容器名稱。它也返回了這個錯誤:

dial tcp 172.19.0.3:5432: getsockopt: connection timed out 

你能告訴我我在這裏失蹤了嗎?我對碼頭工人沒有經驗,而且這花了很長時間調查解決方案。

編輯: 我運行使用此命令我golang泊塢窗:

docker run --env-file ./example.env --rm -it -p 8080:8080 api-test 

example.env是該文件包含我的環境瓦爾。

編輯2: 我改變了連接字符串如下:

postgresql://user:[email protected]:5432?sslmode=disable 

它返回以下錯誤:

dial tcp: lookup postgres on 192.168.65.1:53: no such host 

我得到的想法,我的Mac是問題在這裏。我的默認DNS是8.8.8.8,這不應該是一個問題。

+0

你有沒有嘗試在url中設置'postgres'作爲主機'postgresql:// user:secret @ postgres/mydb?sslmode = disable'?與服務名稱相同。 –

+0

@Зелёныйyup試過了,它返回了以下錯誤:'撥號tcp 202.71.99.194:5432:getsockopt:連接被拒絕' –

+0

您確定您允許Postgres'pg_hba.conf'中的TCP/IP網絡上的所有連接嗎? –

回答

2

看起來就像你去拉圖像,而不是建立你自己的形象。

而不是image: golang:1.7build: .代替它來構建和使用您的Dockerfile

你也可能需要通過Postgres的環境變量DB_HOSTDB_USERDB_PASS等就可以實現這一點,但在創建例如docker.env文件,然後添加env_file你去應用下docker-compose.yml文件:

例docker.env:

DB_HOST=postgres 
DB_USER=user 
DB_PASS=pass 
DB_NAME=mydb 

更正泊塢窗,compose.yml:

version: '2' 
services: 
    app: 
     build: . 
     volumes: 
      - ./:/server/http 
     ports: 
      - "80:8080" 
     links: 
      - postgres 
      - mongodb 
      - redis 
     environment: 
      DEBUG: 'true' 
      PORT: '8080' 
     env_file: 
      - docker.env 

    postgres: 
     image: onjin/alpine-postgres:9.5 
     restart: unless-stopped 
     ports: 
      - "5432:5432" 
     environment: 
      LC_ALL: C.UTF-8 
      POSTGRES_USER: user 
      POSTGRES_PASSWORD: pass 
      POSTGRES_DB: mydb 

    mongodb: 
     image: mvertes/alpine-mongo:3.2.3 
     restart: unless-stopped 
     ports: 
      - "27017:27017" 

    redis: 
     image: sickp/alpine-redis:3.2.2 
     restart: unless-stopped 
     ports: 
      - "6379:6379" 
0

看看一本手冊:https://docs.docker.com/engine/userguide/networking/default_network/configure-dns/

之後,關於你泊塢窗,撰寫文件,通過「Postgres的」在你的連接字符串替換「主機」的鏈接:

postgresql://user:[email protected]/mydb?sslmode=disable 

讓嵌入式DNS服務器執行映射工作,因爲每當您重新創建容器時,IP地址可能會更改。

此外,確保Postgres允許連接(也許僅限於本地主機)

相關問題