【问题标题】:Docker-compose Postgres connection refusedDocker-compose Postgres 连接被拒绝
【发布时间】:2021-10-12 12:52:39
【问题描述】:

我在 docker-compose 上使用 pg-admin 和 GO 运行 Postgres DB。

问题:我可以从pg-admin 连接到Postgres。但无法从Go 建立连接。

我尝试了不同的身份验证字符串组合,但它不起作用。字符串格式与此处 https://github.com/karlkeefer/pngr 相同 - 但容器名称不同 - database

(错误)连接 URL:

backend_1         | 2021/08/08 14:24:40 DB connection: database://main:fugZwypczB94m0LP7CcH@postgres:5432/temp_db?sslmode=disable
backend_1         | 2021/08/08 14:24:40 Unalble to open DB connection: dial tcp 127.0.0.1:5432: connect: connection refused

(URI 生成与此处相同https://github.com/karlkeefer/pngr

Docker:

version: '3.8'
services:
  backend:
    restart: always
    build: 
      context: backend
      target: dev
    volumes:
      - ./backend:/root
    ports:
      - "5000:5000"
    env_file: .env
    depends_on: 
      - database
  database:
    build: database
    restart: always
    environment:
      POSTGRES_DB: ${POSTGRES_DB}
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      PGDATA: /var/lib/postgresql/data
    volumes:
      - ./database/data:/var/lib/postgresql/data
      - ./logs/databse:/var/log/postgresql
      - ./database/migrations:/docker-entrypoint-initdb.d/migrations
    ports:
      - "5432:5432"
  database-admin:
    image: dpage/pgadmin4:5.5
    restart: always
    environment:
      PGADMIN_DEFAULT_EMAIL: ${PG_ADMIN_EMAIL}
      PGADMIN_DEFAULT_PASSWORD: ${PG_ADMIN_PASSWORD}
      PGADMIN_LISTEN_PORT: 80
    ports:
      - "8080:80"
    volumes:
      - ./database/admin:/var/lib/pgadmin
    links:
      - "database:pgsql-server"
    depends_on: 
      - database
volumes:
  database:
  database-admin:

环境:

POSTGRES_HOST=postgres
POSTGRES_PORT=5432
POSTGRES_DB=temp_db
POSTGRES_USER=main
POSTGRES_PASSWORD=fugZwypczB94m0LP7CcH
PG_ADMIN_EMAIL=admin@temp.com
PG_ADMIN_PASSWORD=ayzi2ta8f1TnX3vKQSN1
PG_ADMIN_PORT=80

GO代码:

db, err = sqlx.Open("postgres", str)

str

func buildConnectionString() string {
    user := os.Getenv("POSTGRES_USER")
    pass := os.Getenv("POSTGRES_PASSWORD")
    if user == "" || pass == "" {
        log.Fatalln("You must include POSTGRES_USER and POSTGRES_PASSWORD environment variables")
    }
    host := os.Getenv("POSTGRES_HOST")
    port := os.Getenv("POSTGRES_PORT")
    dbname := os.Getenv("POSTGRES_DB")
    if host == "" || port == "" || dbname == "" {
        log.Fatalln("You must include POSTGRES_HOST, POSTGRES_PORT, and POSTGRES_DB environment variables")
    }

    str := fmt.Sprintf("database://%s:%s@%s:%s/%s?sslmode=disable", user, pass, host, port, dbname)

    log.Println("DB connection: " + str)

    return str
}

提前致谢!

【问题讨论】:

    标签: postgresql docker go docker-compose


    【解决方案1】:

    您将数据库主机名引用为postgres (POSTGRES_HOST=postgres),这很好,但容器/服务名称为database

    要么将 compose.yaml 中的名称从 database 更改为 postgres,要么添加明确的 hostname 字段:

    database:
      build: database
      restart: always
      hostname: postgres   # <- add this
    

    您可能还想为多个容器服务添加一个专用的network 以相互交谈(或阻止其他人交谈)。为此,请将其添加到您要使用特定网络的每个服务中,例如

    database:
      # ...
    
      networks:
        - mynet
    
    backend:
      # ...
    
      networks:
        - mynet
    

    并在 compose.yaml 末尾定义网络

    networks:
      mynet:
        name: my-shared-db-network
    

    【讨论】:

    • 嗨@colm.anseo,谢谢提示!
    • 刚刚尝试过,还更新了 URI 以postgres 开头,它成功了!谢谢!只需更改环境中的主机名。向database 提交的文件无效,我认为这是设计使然? (真的很困惑)
    猜你喜欢
    • 2020-09-08
    • 2019-01-02
    • 2019-11-12
    • 2021-05-26
    • 2018-07-03
    • 2021-03-23
    • 2022-01-01
    • 2016-03-08
    • 2017-08-05
    相关资源
    最近更新 更多