首页 > 解决方案 > 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'


标签: postgresqldockergodocker-composego-gin

解决方案


正如@Oras 端口所提到的,似乎有一些缺少的端口要暴露:5432:5432只需将其添加到从问题中排除端口,也从您遇到的错误中排除,您的 docker 应用程序容器似乎依赖于数据库容器,因此您需要拥有一种等到您的数据库容器启动并且您的应用程序容器可以连接它的方法,检查depends_ondocker 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时有几点需要注意:

  1. 在启动 web 之前,depends_on 不会等待 db 和 redis “准备好” - 仅在它们启动之前。如果您需要等待服务准备好,请参阅控制启动顺序以获取有关此问题的更多信息以及解决该问题的策略。

  2. 版本 3 不再支持depends_on 的条件形式。

  3. 在使用版本 3 Compose 文件以 swarm 模式部署堆栈时,将忽略 depends_on 选项。

并且基于上述说明,您可能仍然会遇到问题,但重启策略将重启应用程序容器,您将连接到数据库。


推荐阅读