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

j13ufse2  于 2023-03-22  发布在  Docker
关注(0)|答案(4)|浏览(193)

我有一个使用golang构建的web服务器。当我在本地测试时,它工作得很成功。
然而,当我为我的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,这应该不是问题。

xtupzzrd

xtupzzrd1#

看起来你是在塑造自己的形象,而不是在塑造自己的形象。
而不是image: golang:1.7替换为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"
p4rjhz4m

p4rjhz4m2#

为了在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错误。

y53ybaqx

y53ybaqx3#

请查看此文档:https://docs.docker.com/engine/userguide/networking/default_network/configure-dns/
然后,关于docker-compose文件中的链接,在连接字符串中将“host”替换为“postgres”:

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

让嵌入式DNS服务器完成Map工作,因为每次重新创建容器时,IP地址都可能发生更改。
另外,确保postgres允许连接(可能限于localhost)

e3bfsja2

e3bfsja24#

你可以使用docker.for.mac.localhost代替localhost或postgres ... postgresql://user:pass@docker.for.mac.localhost/mydb?sslmode=disable
它对我有效,但只对mac有效。

相关问题