无法从Golang容器连接到Postgres docker容器

我有一个使用golang构build的web服务器。 当我在本地testing它时,它工作正常。

但是,当我为我的Web服务器构buildDocker镜像时,它无法连接到正在运行的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连接string:

 postgresql://user:pass@host/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 

你能告诉我我在这里错过了什么吗? 我对docker工人没有经验,而且这花了很长时间来研究解决scheme。

编辑:我使用这个命令来运行我的golang docker:

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

example.env是包含我的环境variables的文件。

编辑2:我将连接string更改为以下内容:

 postgresql://user:pass@postgres:5432?sslmode=disable 

它返回以下错误:

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

我得到的想法,我的Mac是这里的问题。 我的默认DNS是8.8.8.8这不应该是一个问题。

看起来像你拉图像而不是build立你自己的形象。

代替image: golang:1.7build: .replace它build: . 构build和使用您的Dockerfile

你也可能需要通过postgres环境variablesDB_HOSTDB_USERDB_PASS等,你可以实现,但创build例如docker.env文件,然后添加env_file在你去应用程序docker-compose.yml文件:

示例docker.env:

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

更正的docker-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" 

看看这个文档: https : //docs.docker.com/engine/userguide/networking/default_network/configure-dns/

然后,关于你的docker-compose文件中的链接,用你的连接string中的“postgres”replace“host”

 postgresql://user:pass@postgres/mydb?sslmode=disable 

让embedded式DNS服务器执行映射工作,因为每当您重新创build容器时,IP地址可能会更改。

另外,确保postgres允许连接(可能仅限于本地主机)