无法从 docker-compose 上的其他服务解析 postgres 主机名

我有一个运行 2 个容器的 docker-compose 文件。其中一项服务是 postgres,另一项是我的后端服务。当我尝试解析 postgres 或尝试从后端服务的 cli 连接它时,它是成功的。但是当我尝试使用 hostname 初始化数据库时,出现以下错误:


2022/09/01 08:49:53 /src/domain/domain.go:29 [错误] 初始化数据库失败,无法连接到host=postgres user=devuser database=backenddev错误:主机名解析错误(查找 postgres:设备或资源繁忙)恐慌:失败连接到 host=postgres user=devuser database=backenddev:主机名解析错误(查找 postgres:设备或资源繁忙)


goroutine 1 [正在运行]: github.com/anilkusc/backend/api.(*Api).Init(0xc00000e150) /src/api/api.go:34 +0x76b github.com/anilkusc/backend/api.(*Api ).Start(0xc00000e150) /src/api/api.go:87 +0x25 main.main() /src/main.go:48 +0x15f


当我尝试从另一个容器 cli 连接 postgresql 时,我得到以下信息:


root@8a0824fca084:/# nc -vz postgres 5432

Connection to postgres (172.25.0.2) 5432 port [tcp/postgresql] succeeded!

root@8a0824fca084:/# curl postgres:5432

curl: (52) Empty reply from server

这是相关的代码块:


        d.Database, err = gorm.Open(postgres.Open(os.Getenv("DB_CONN")), &gorm.Config{})

        if err != nil {

            return err

        }

这是撰写文件:


version: '3.6'

services:

  postgres:

    image: postgres:14.5

    restart: always

    environment:

      POSTGRES_PASSWORD: <>

      POSTGRES_DB: backenddev

      POSTGRES_USER: devuser 

    ports:

      - 5432:5432


  backend:

    image: my-service:v0.0.2

    restart: always

    environment:

      ENV: dev

      STORE_KEY: 1234

      DB_CONN: host=postgres user=devuser password=<> dbname=backenddev port=5432

    ports:

      - 8080:8080

    depends_on:

      - postgres

这是后端服务的 dockerfile :


FROM golang:1.18.4 as build

WORKDIR /src

COPY go.sum go.mod ./

RUN go mod download

COPY . . 

RUN go build -a -ldflags "-linkmode external -extldflags '-static' -s -w" -o /bin/app.


FROM alpine

WORKDIR /app

COPY --from=build /bin/app .

CMD ["./app"]

如果我尝试使用后端服务上的外部 ip 和端口连接到数据库,它也会成功,但内部连接到 postgresql 时运气不好。


为什么我的应用程序无法解析 postgres 主机,即使它的主机容器可以?


慕容708150
浏览 225回答 1
1回答

莫回无

这可能与 alpine 容器和 golang 1.18.4 容器 dns 库之间的不兼容有关。我将容器映像从 alpine 更改为 debian,问题已解决。FROM golang:1.18.4 as buildWORKDIR /srcCOPY go.sum go.mod ./RUN go mod downloadCOPY . .&nbsp;RUN go build -a -ldflags "-linkmode external -extldflags '-static' -s -w" -o /bin/app.FROM debian:buster-slim #just changed here!WORKDIR /appCOPY --from=build /bin/app .CMD ["./app"]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go