英文:
Docker-compose Postgres connection refused
问题
我正在运行带有pg-admin和GO的docker-compose的Postgres数据库。
问题:我可以从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
}
提前感谢!
英文:
I'm running Postgres DB with pg-admin and GO on the docker-compose.
Problem: I can connect from pg-admin to Postgres. But cannot establish a connection from Go.
I tried different combinations of authentication string but it does not work. String format same as here https://github.com/karlkeefer/pngr - but different container name - database
(ERROR) Connection 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 generation same as here 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:
Environment:
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 Code:
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
}
Thanks in advance!
答案1
得分: 9
你将数据库主机名引用为postgres(POSTGRES_HOST=postgres),这是可以的,但容器/服务名称是database。
要么在你的compose.yaml中将名称从database更改为postgres,要么添加一个显式的hostname字段:
database:
  build: database
  restart: always
  hostname: postgres   # <- 添加这个
你可能还想为多个容器服务之间的通信(或防止其他容器访问)添加一个专用的网络。为此,请在每个要使用特定网络的服务中添加以下内容:
database:
  # ...
  networks:
    - mynet
backend:
  # ...
  networks:
    - mynet
并在compose.yaml的末尾定义网络:
networks:
  mynet:
    name: my-shared-db-network
英文:
You reference the database hostname as postgres (POSTGRES_HOST=postgres) which is fine, but the container/service name is database.
Either change the name in your compose.yaml from database to postgres or add an explicit hostname field:
database:
  build: database
  restart: always
  hostname: postgres   # <- add this
You may also want to add a dedicated network for multiple container services to talk to one another (or prevent others from). To do this, add this to each service your want to use a specific network e.g.
database:
  # ...
  networks:
    - mynet
backend:
  # ...
  networks:
    - mynet
and define the network at the end of your compose.yaml
networks:
  mynet:
    name: my-shared-db-network
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论