Docker-compose Postgres连接被拒绝。

huangapple go评论120阅读模式
英文:

Docker-compose Postgres connection refused

问题

我正在运行带有pg-admin和GO的docker-compose的Postgres数据库。

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

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

(错误)连接URL:

  1. backend_1 | 2021/08/08 14:24:40 DB connection: database://main:fugZwypczB94m0LP7CcH@postgres:5432/temp_db?sslmode=disable
  2. 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:

  1. version: '3.8'
  2. services:
  3. backend:
  4. restart: always
  5. build:
  6. context: backend
  7. target: dev
  8. volumes:
  9. - ./backend:/root
  10. ports:
  11. - "5000:5000"
  12. env_file: .env
  13. depends_on:
  14. - database
  15. database:
  16. build: database
  17. restart: always
  18. environment:
  19. POSTGRES_DB: ${POSTGRES_DB}
  20. POSTGRES_USER: ${POSTGRES_USER}
  21. POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
  22. PGDATA: /var/lib/postgresql/data
  23. volumes:
  24. - ./database/data:/var/lib/postgresql/data
  25. - ./logs/databse:/var/log/postgresql
  26. - ./database/migrations:/docker-entrypoint-initdb.d/migrations
  27. ports:
  28. - "5432:5432"
  29. database-admin:
  30. image: dpage/pgadmin4:5.5
  31. restart: always
  32. environment:
  33. PGADMIN_DEFAULT_EMAIL: ${PG_ADMIN_EMAIL}
  34. PGADMIN_DEFAULT_PASSWORD: ${PG_ADMIN_PASSWORD}
  35. PGADMIN_LISTEN_PORT: 80
  36. ports:
  37. - "8080:80"
  38. volumes:
  39. - ./database/admin:/var/lib/pgadmin
  40. links:
  41. - "database:pgsql-server"
  42. depends_on:
  43. - database
  44. volumes:
  45. database:
  46. database-admin:

环境变量:

  1. POSTGRES_HOST=postgres
  2. POSTGRES_PORT=5432
  3. POSTGRES_DB=temp_db
  4. POSTGRES_USER=main
  5. POSTGRES_PASSWORD=fugZwypczB94m0LP7CcH
  6. PG_ADMIN_EMAIL=admin@temp.com
  7. PG_ADMIN_PASSWORD=ayzi2ta8f1TnX3vKQSN1
  8. PG_ADMIN_PORT=80

GO代码:

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

str

  1. func buildConnectionString() string {
  2. user := os.Getenv("POSTGRES_USER")
  3. pass := os.Getenv("POSTGRES_PASSWORD")
  4. if user == "" || pass == "" {
  5. log.Fatalln("You must include POSTGRES_USER and POSTGRES_PASSWORD environment variables")
  6. }
  7. host := os.Getenv("POSTGRES_HOST")
  8. port := os.Getenv("POSTGRES_PORT")
  9. dbname := os.Getenv("POSTGRES_DB")
  10. if host == "" || port == "" || dbname == "" {
  11. log.Fatalln("You must include POSTGRES_HOST, POSTGRES_PORT, and POSTGRES_DB environment variables")
  12. }
  13. str := fmt.Sprintf("database://%s:%s@%s:%s/%s?sslmode=disable", user, pass, host, port, dbname)
  14. log.Println("DB connection: " + str)
  15. return str
  16. }

提前感谢!

英文:

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:

  1. backend_1 | 2021/08/08 14:24:40 DB connection: database://main:fugZwypczB94m0LP7CcH@postgres:5432/temp_db?sslmode=disable
  2. 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:

  1. version: '3.8'
  2. services:
  3. backend:
  4. restart: always
  5. build:
  6. context: backend
  7. target: dev
  8. volumes:
  9. - ./backend:/root
  10. ports:
  11. - "5000:5000"
  12. env_file: .env
  13. depends_on:
  14. - database
  15. database:
  16. build: database
  17. restart: always
  18. environment:
  19. POSTGRES_DB: ${POSTGRES_DB}
  20. POSTGRES_USER: ${POSTGRES_USER}
  21. POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
  22. PGDATA: /var/lib/postgresql/data
  23. volumes:
  24. - ./database/data:/var/lib/postgresql/data
  25. - ./logs/databse:/var/log/postgresql
  26. - ./database/migrations:/docker-entrypoint-initdb.d/migrations
  27. ports:
  28. - "5432:5432"
  29. database-admin:
  30. image: dpage/pgadmin4:5.5
  31. restart: always
  32. environment:
  33. PGADMIN_DEFAULT_EMAIL: ${PG_ADMIN_EMAIL}
  34. PGADMIN_DEFAULT_PASSWORD: ${PG_ADMIN_PASSWORD}
  35. PGADMIN_LISTEN_PORT: 80
  36. ports:
  37. - "8080:80"
  38. volumes:
  39. - ./database/admin:/var/lib/pgadmin
  40. links:
  41. - "database:pgsql-server"
  42. depends_on:
  43. - database
  44. volumes:
  45. database:
  46. database-admin:

Environment:

  1. POSTGRES_HOST=postgres
  2. POSTGRES_PORT=5432
  3. POSTGRES_DB=temp_db
  4. POSTGRES_USER=main
  5. POSTGRES_PASSWORD=fugZwypczB94m0LP7CcH
  6. PG_ADMIN_EMAIL=admin@temp.com
  7. PG_ADMIN_PASSWORD=ayzi2ta8f1TnX3vKQSN1
  8. PG_ADMIN_PORT=80

GO Code:

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

str

  1. func buildConnectionString() string {
  2. user := os.Getenv("POSTGRES_USER")
  3. pass := os.Getenv("POSTGRES_PASSWORD")
  4. if user == "" || pass == "" {
  5. log.Fatalln("You must include POSTGRES_USER and POSTGRES_PASSWORD environment variables")
  6. }
  7. host := os.Getenv("POSTGRES_HOST")
  8. port := os.Getenv("POSTGRES_PORT")
  9. dbname := os.Getenv("POSTGRES_DB")
  10. if host == "" || port == "" || dbname == "" {
  11. log.Fatalln("You must include POSTGRES_HOST, POSTGRES_PORT, and POSTGRES_DB environment variables")
  12. }
  13. str := fmt.Sprintf("database://%s:%s@%s:%s/%s?sslmode=disable", user, pass, host, port, dbname)
  14. log.Println("DB connection: " + str)
  15. return str
  16. }

Thanks in advance!

答案1

得分: 9

你将数据库主机名引用为postgresPOSTGRES_HOST=postgres),这是可以的,但容器/服务名称是database

要么在你的compose.yaml中将名称从database更改为postgres,要么添加一个显式的hostname字段:

  1. database:
  2. build: database
  3. restart: always
  4. hostname: postgres # <- 添加这个

你可能还想为多个容器服务之间的通信(或防止其他容器访问)添加一个专用的网络。为此,请在每个要使用特定网络的服务中添加以下内容:

  1. database:
  2. # ...
  3. networks:
  4. - mynet
  5. backend:
  6. # ...
  7. networks:
  8. - mynet

并在compose.yaml的末尾定义网络:

  1. networks:
  2. mynet:
  3. 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:

  1. database:
  2. build: database
  3. restart: always
  4. 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.

  1. database:
  2. # ...
  3. networks:
  4. - mynet
  5. backend:
  6. # ...
  7. networks:
  8. - mynet

and define the network at the end of your compose.yaml

  1. networks:
  2. mynet:
  3. name: my-shared-db-network

huangapple
  • 本文由 发表于 2021年8月8日 22:31:25
  • 转载请务必保留本文链接:https://go.coder-hub.com/68701716.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定