簡體   English   中英

無法從 Golang 容器連接到 Postgres docker 容器

[英]Can't connect to Postgres docker container from Golang container

我有一個使用 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"

我的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: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 缺乏經驗,這花了很長時間來尋找解決方案。

編輯:我使用以下命令運行我的 golang docker:

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

example.env是包含我的環境變量的文件。

編輯 2:我將連接字符串更改為以下內容:

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 ,這應該不是問題。

看起來您正在拉取圖像而不是構建您自己的圖像。

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

此外,您可能需要傳遞 postgres 環境變量DB_HOSTDB_USERDB_PASS等。您可以實現這一點,但創建例如docker.env文件,然后在您的 go app docker-compose.yml文件下添加env_file

示例 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 文件中的鏈接,將連接字符串中的“host”替換為“postgres”:

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

讓內嵌的 DNS 服務器來做映射工作,因為每次重新創建容器時,ip 地址都可能會發生變化。

此外,確保 postgres 允許連接(可能僅限於本地主機)

為了在 docker compose 中建立與 postgres 的連接,您需要將連接字符串中的localhost127.0.0.1postgres替換為 docker compose 文件中提到的容器的名稱。

例如,在您的 docker-compose.yaml 文件中,像這樣創建數據庫:

db:
    container_name: composepostgres
    image: postgres
    environment:

然后,在創建連接字符串時的代碼中,避免使用127.0.0.1localhostpostgres ,而是使用composepostgres代替它們。

如果不這樣做,您將面臨dial tcp 127.0.0.1:5432: connect: connection refused錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM