我收到来自 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)
出现在下一个Dockerfile和docker-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,这可能是问题的原因吗?
在连接到桥接网络(默认)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是设置一个环境变量,而不是映射一个端口(注意,这是不实际需要app谈db,如果他们都是相同的桥接网络为是默认的情况下)。
注意 2:在这种情况下您不需要使用链接(这是一个遗留功能)。
| 归档时间: |
|
| 查看次数: |
6610 次 |
| 最近记录: |