我有一个 docker 组成的文件,其中运行2个容器. 其中一个服务是postgres,另一个是我的后端服务. 当我try 解析postgres或try 从后端服务的cli连接它时,它成功了. 但是,当我try 使用主机名初始化数据库时,我得到了以下错误:

2022/09/01 08:49:53/src/域/域.转: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

当我try 从另一个容器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"]

如果我try 使用后端服务上的外部IP和端口连接到数据库,也是成功的,但对于内部连接到PostgreSQL则没有运气.

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

推荐答案

感谢@英国人. 这可能与阿尔卑斯容器和Golang 1.18.4容器的DNS库不兼容有关. 我把我的容器镜像从高山改为Debian,这个问题已经解决了.

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 debian:buster-slim #just changed here!
WORKDIR /app
COPY --from=build /bin/app .
CMD ["./app"]

Postgresql相关问答推荐

PostgreSQL数据文件是否仅在判断点期间写入磁盘?

如何在生成的列的表达式中使用TIMESTAMP WITH时区列?

Prisma:获取连接的活动 Postgresql 模式的名称

如何创建一个触发器来传播对主键表的更新?

在 jOOQ 中使用 $$ 引用字符串

带有附加组的时间刻度 interpolated_average

PostgreSQL pg_dump 创建 sql 脚本,但它不是 sql 脚本:有没有办法让 pg_dump 创建标准的 sql 脚本?

postgres 和 python

INSERT RETURNING 是否保证以 right的顺序返回?

我如何在docker中备份数据库

是否可以在 Postgres 中存储一个 1 字节的数字?

Postgres 在 WHERE id != int 查询中排除 NULL

Postgres 中的相似函数与 pg_trgm

将 SELECT 结果作为参数传递给 postgreSQL 函数

如何防止materialized 视图在 pg_restore 期间刷新?

丢弃顺序和级联

Postgres jsonbNOT contains运算符

从没有行的计数中获取 0 值

使用 current_setting() 判断值

Postgres NOT IN (null) 没有结果