连接:无法分配请求的地址

Pos*_*ism 1 postgresql docker

我收到来自 Docker 中的 Go 应用程序的以下错误消息:

panic: failed to connect to `host=localhost user=postgres-dev database=dev`: dial error (dial tcp [::1]:5432: connect: cannot assign requested address)
Run Code Online (Sandbox Code Playgroud)

出现在下一个Dockerfiledocker-compose.yml文件的环境中:

FROM golang:latest

WORKDIR /WD

COPY go.mod go.sum ./

RUN go mod download

COPY . .
Run Code Online (Sandbox Code Playgroud)

docker-compose.yml文件中:

version: '3'
services:
    db:
        image: postgres:latest
        environment:
            POSTGRES_DB: dev
            POSTGRES_USER: postgres-dev
            POSTGRES_PASSWORD: [~secret~]
            ports: 5432:5432
    app:
        build: .
        command: ["./wait-for-it.sh", "db:5432", "--", "go", "run", "main.go"]
        volumes:
            - .:/WD
        ports:
            - "8000:8000"
        depends_on: 
            - db
        links: 
            - db

Run Code Online (Sandbox Code Playgroud)

这里的main.go文件:

FROM golang:latest

WORKDIR /WD

COPY go.mod go.sum ./

RUN go mod download

COPY . .
Run Code Online (Sandbox Code Playgroud)

这可能有帮助吗?

在控制台日志中,我找到了下一行,我认为这与问题有关:

version: '3'
services:
    db:
        image: postgres:latest
        environment:
            POSTGRES_DB: dev
            POSTGRES_USER: postgres-dev
            POSTGRES_PASSWORD: [~secret~]
            ports: 5432:5432
    app:
        build: .
        command: ["./wait-for-it.sh", "db:5432", "--", "go", "run", "main.go"]
        volumes:
            - .:/WD
        ports:
            - "8000:8000"
        depends_on: 
            - db
        links: 
            - db

Run Code Online (Sandbox Code Playgroud)

数据库的地址是:: with port 5432,当程序尝试连接时::1 with port 5432,这可能是问题的原因吗?

Bri*_*its 5

在连接到桥接网络(默认)localhost(127.0.0.1) 的容器内是容器本身。因此,您的app容器正在尝试在其自身(而不是在主机或db容器上)访问端口 5432 上的数据库。最简单的解决方法是更改​​连接字符串:

postgresql://postgres-dev:[~secret~]@localhost:5432/dev

postgresql://postgres-dev:[~secret~]@db:5432/dev

注:我觉得你有你的一个错字docker-compose.yml-ports: 5432:5432是设置一个环境变量,而不是映射一个端口(注意,这是不实际需要appdb,如果他们都是相同的桥接网络为是默认的情况下)。

注意 2:在这种情况下您不需要使用链接(这是一个遗留功能)。