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

Sam*_*raf 4 postgresql docker

我有一个使用 golang 构建的网络服务器。我在本地测试的时候是成功的。

但是,当我为 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"
Run Code Online (Sandbox Code Playgroud)

我的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
Run Code Online (Sandbox Code Playgroud)

我正在使用的 Postgres 连接字符串:

postgresql://user:pass@host/mydb?sslmode=disable
Run Code Online (Sandbox Code Playgroud)

对于主机,我尝试过localhost,它返回以下错误:

dial tcp [::1]:5432: getsockopt: connection refused
Run Code Online (Sandbox Code Playgroud)

尝试了一下postgres,它返回以下内容:

dial tcp 202.71.99.194:5432: getsockopt: connection refused
Run Code Online (Sandbox Code Playgroud)

尝试了我运行此命令时得到的 IP 地址,该命令返回172.19.0.3

docker inspect apitest_postgres_1 | grep IPAddress
Run Code Online (Sandbox Code Playgroud)

其中apitest_postgres_1是 Postgres 容器名称。它还返回了这个错误:

dial tcp 172.19.0.3:5432: getsockopt: connection timed out
Run Code Online (Sandbox Code Playgroud)

你能告诉我我在这里缺少什么吗?我对 docker 缺乏经验,这花了很长时间来研究解决方案。

编辑: 我使用以下命令运行我的 golang docker:

docker run --env-file ./example.env --rm -it -p 8080:8080  api-test
Run Code Online (Sandbox Code Playgroud)

example.env该文件包含我的环境变量。

编辑2: 我将连接字符串更改为以下内容:

postgresql://user:pass@postgres:5432?sslmode=disable
Run Code Online (Sandbox Code Playgroud)

它返回以下错误:

dial tcp: lookup postgres on 192.168.65.1:53: no such host
Run Code Online (Sandbox Code Playgroud)

我发现我的 mac 是这里的问题。我的默认 DNS8.8.8.8应该不是问题。

小智 5

看起来你正在拉取图像而不是构建你自己的图像。

而不是image: golang:1.7将其替换为build: .构建和使用您的Dockerfile.

此外,您可能需要传递 postgres 环境变量等DB_HOST。您可以实现这一点DB_USERDB_PASS但创建示例docker.env文件,然后env_file在您的 go 应用程序docker-compose.yml文件下添加:

示例 docker.env :

DB_HOST=postgres
DB_USER=user
DB_PASS=pass
DB_NAME=mydb
Run Code Online (Sandbox Code Playgroud)

更正了 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"
Run Code Online (Sandbox Code Playgroud)