postgresql - Docker golang gin postgres
问题描述
我正在尝试使用 Postgres 为 golang 应用程序设置一个 docker。如果我删除/评论 Postgres,go 应用程序在容器中运行良好。同样,我能够启动 Postgres 容器并登录到它。我可以做 docker-compose up。但是当我进行 API 调用时,例如:localhost:3000/api/admin/users
. 它给出了错误:
error: {
"error": "+dial tcp 127.0.0.1:5432: connect: connection refused"
}
Postgres 连接字符串是这样的:
connStr := fmt.Sprintf("host=postgres user=anurag password=anu_12345 dbname=bankingapp sslmode=disable")
db, err := sql.Open("postgres", connStr)
Dockerfile
FROM golang:1.13
WORKDIR /go/src/banking-app
COPY . .
RUN go get -d -v ./...
RUN go install -v ./...
CMD ["go" , "run", "main.go"]
码头工人-compose.yml
version: '3'
services:
web:
build: .
ports:
- "3000:3000"
postgres:
image: "postgres"
environment:
POSTGRES_USER: 'anurag'
POSTGRES_PASSWORD: 'anu_12345'
POSTGRES_DB: 'bankingapp'
解决方案
正如@Oras 端口所提到的,似乎有一些缺少的端口要暴露:5432:5432
只需将其添加到从问题中排除端口,也从您遇到的错误中排除,您的 docker 应用程序容器似乎依赖于数据库容器,因此您需要拥有一种等到您的数据库容器启动并且您的应用程序容器可以连接它的方法,检查depends_on
docker compose:
https://docs.docker.com/compose/compose-file/
version: '3'
services:
web:
build: .
ports:
- "3000:3000"
depends_on:
postgres
restart_policy:
condition: on-failure
postgres:
image: "postgres"
ports:
- "3000:3000"
environment:
POSTGRES_USER: 'anurag'
POSTGRES_PASSWORD: 'anu_12345'
POSTGRES_DB: 'bankingapp'
使用depends_on时有几点需要注意:
在启动 web 之前,depends_on 不会等待 db 和 redis “准备好” - 仅在它们启动之前。如果您需要等待服务准备好,请参阅控制启动顺序以获取有关此问题的更多信息以及解决该问题的策略。
版本 3 不再支持depends_on 的条件形式。
在使用版本 3 Compose 文件以 swarm 模式部署堆栈时,将忽略 depends_on 选项。
并且基于上述说明,您可能仍然会遇到问题,但重启策略将重启应用程序容器,您将连接到数据库。
推荐阅读
- wordpress - Divi 博客网格在悬停时显示标题
- javascript - 如何缩放不在原点的 svg 路径并将其居中
- qt5 - QtCreator 在 MacOS SDK 11.1 上失败
- python - 如何在python中找到由嵌套数组组成的参数的平均值
- entity-relationship - ERD 或 MCD 一对多图
- php - 使用 AWS 开发工具包 NoSuchBucket 错误将文件上传到 S3 存储桶
- udp - 如何检测包丢失和与 QuestDb 的 UDP 发布者的差距?
- oracle - 单击按钮代码时需要在新选项卡上打开输出
- c - mp4 文件中间的随机编解码器信息
- javascript - 当我从 javascript 使用 parseInt 时我很困惑