You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Podman Compose中Golang应用Docker镜像无法连接Postgres镜像

问题:Podman-Compose下Golang应用无法连接Postgres容器

我是Podman新手,尝试用podman-compose通过docker-compose.yml构建多个镜像,但我的authentication-service Golang应用容器始终无法连接到Postgres容器,报错提示主机不存在。

报错信息

failed to connect to `host=postgres user=postgres database=users`: hostname resolving error (lookup postgres on 10.89.0.1:53: no such host)

使用的Podman命令

podman-compose up -d
podman ps
podman logs container-id

Podman日志

podman终端日志

docker-compose.yml配置

version: '3'

services:

  broker-service:
    build:
      context: ./../broker-service
      dockerfile: ./../broker-service/broker-service.dockerfile
    restart: always
    ports:
      - "8080:80"
    deploy:
      mode: replicated
      replicas: 1

  authentication-service:
    build:
      context: ./../authentication-service
      dockerfile: ./../authentication-service/authentication-service.dockerfile
    restart: always
    ports:
      - "8081:80"
    deploy:
      mode: replicated
      replicas: 1
    environment:
      DSN: "host=postgres port=5432 user=postgres password=password dbname=users sslmode=disable timezone=UTC connect_timeout=5"

  postgres:
    image: 'postgres:14.2'
    ports:
      - "5432:5432"
    restart: always
    deploy:
      mode: replicated
      replicas: 1
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: password
      POSTGRES_DB: users
    volumes:
      - ./db-data/postgres/:/var/lib/postgresql/data/

main.go核心代码

package main

import (
    "authentication-service/data"
    "database/sql"
    "fmt"
    "log"
    "net/http"
    "os"
    "time"

    _ "github.com/jackc/pgconn"
    _ "github.com/jackc/pgx/v4"
    _ "github.com/jackc/pgx/v4/stdlib"
)

const webPort = "80"

var counts int64

type Config struct {
    DB     *sql.DB
    Models data.Models
}

func main() {
    log.Println("Starting authentication server")

    // connect to DB
    conn := connectToDB()
    if conn == nil {
        log.Panic("Can't connect to Postgres!")
    }

    // setup config
    app := Config{
        DB:     conn,
        Models: data.New(conn),
    }

    // define http server
    srv := &http.Server{
        Addr:    fmt.Sprintf(":%s", webPort),
        Handler: app.routes(),
    }

    // start the server
    err := srv.ListenAndServe()
    if err != nil {
        log.Panic(err)
    }
}

// function to open the database
func openDB(dsn string) (*sql.DB, error) {
    db, err := sql.Open("pgx", dsn)
    if err != nil {
        log.Printf("open db pgx error: %s", err)
        return nil, err
    }

    err = db.Ping()
    if err != nil {
        log.Printf("db ping error: %s", err)
        return nil, err
    }

    return db, nil
}

// function to connect to the database
func connectToDB() *sql.DB {
    dsn := os.Getenv("DSN")

    for {
        connection, err := openDB(dsn)
        if err != nil {
            log.Println("Postgres not yet ready...")
            counts++
        } else {
            log.Println("Connected to Postgres!")
            return connection
        }

        if counts > 10 {
            log.Println(err)
            return nil
        }

        log.Println("Backing off for 2 seconds...")
        time.Sleep(2 * time.Second)
        continue
    }
}

解决方法

1. 添加容器启动依赖

在authentication-service服务中添加depends_on配置,确保Postgres容器优先启动:

authentication-service:
  # 保留原有配置
  depends_on:
    - postgres

注意:该配置仅保证启动顺序,不保证Postgres服务完全就绪,你的代码已包含重试逻辑,可继续保留。

2. 手动指定专属网络

Podman-Compose默认会创建项目专属网络,但偶尔会出现DNS解析异常,可手动定义网络:

version: '3'

networks:
  app-network:
    driver: bridge

services:
  broker-service:
    # 保留原有配置
    networks:
      - app-network
  authentication-service:
    # 保留原有配置
    networks:
      - app-network
  postgres:
    # 保留原有配置
    networks:
      - app-network

3. 验证网络连通性

启动容器后,进入authentication-service容器测试与Postgres的连通性:

podman exec -it <authentication-service容器ID> ping postgres

若ping不通,检查Podman网络状态:

podman network ls
podman inspect <项目网络名称>

4. 升级Podman及组件版本

部分旧版本Podman/Podman-Compose存在DNS解析bug,建议更新到最新稳定版:

# 以Fedora为例
sudo dnf update podman podman-compose

5. 确认DSN配置正确性

你当前的DSN中host=postgres配置正确,同一Compose网络内服务名可直接作为DNS别名使用,无需修改。


内容的提问来源于stack exchange,提问作者Siddhivinayak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 17:47:06