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日志

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
相关产品推荐
相关产品推荐

