我有一個 Golang 服務器,旁邊是在 docker compose 中運行的 Postgres 實體。由于某種原因,Postgres 拒絕連接。從我以前的所有搜索中,通常問題是拼寫錯誤,沒有暴露埠,有 SSL 等等,但我沒有任何類似的事情發生并且仍然有這個問題
version: "3.2"
services:
ingress:
image: jwilder/nginx-proxy
ports:
- "3000:80"
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
auth-service:
depends_on:
- rabbitmq
- auth-db
- ingress
build: ./auth
container_name: "auth-service"
ports:
- 3001:3000
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
- POSTGRES_HOST=auth-db
- POSTGRES_DB=auth-dev
- POSTGRES_PORT=5435
- PORT=3000
- RABBITMQ_USER=guest
- RABBITMQ_PASSWORD=guest
- RABBITMQ_HOST=rabbitmq
- RABBITMQ_PORT=5672
- VIRTUAL_HOST=api.twitchy.dev
- VIRTUAL_PATH=/v1/auth/
deploy:
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
window: 120s
# networks:
# - rabbitmq_net
# - default
rabbitmq:
image: rabbitmq:3-management-alpine
container_name: "rabbitmq"
ports:
- 5672:5672
- 15672:15672
volumes:
- rabbitmq_data:/var/lib/rabbitmq/
- rabbitmq_log:/var/log/rabbitmq/
# networks:
# - rabbitmq_net
auth-db:
image: postgres:14.1-alpine
restart: always
container_name: "auth-db"
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
- POSTGRES_DB=auth-dev
ports:
- "5435:5432"
volumes:
- db:/var/lib/postgresql/data
chat-db:
image: postgres:14.1-alpine
restart: always
container_name: "chat-db"
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
- POSTGRES_DB=chat-dev
ports:
- "5434:5432"
volumes:
- db:/var/lib/postgresql/data
# networks:
# rabbitmq_net:
# driver: bridge
volumes:
db:
driver: local
rabbitmq_data:
rabbitmq_log:
這是我得到的錯誤
auth-service | Retrying connection to database...
auth-service | failed to connect to `host=auth-db user=postgres database=auth-dev`: dial error (dial tcp 172.23.0.3:5435: connect: connection refused)
我的 Golang 代碼用于連接資料庫(使用 pgx)
dbUrl := fmt.Sprintf("postgres://%s:%s@%s:%s/%s?sslmode=disable",
os.Getenv("POSTGRES_USER"),
os.Getenv("POSTGRES_PASSWORD"),
os.Getenv("POSTGRES_HOST"),
os.Getenv("POSTGRES_PORT"),
os.Getenv("POSTGRES_DB"))
這就是為什么我很困惑
- 埠匹配,我從 postgres 公開 5435,然后連接到 5435
- 主機應該是正確的,因為我參考的是 auth-db 服務名稱,并且它們位于同一個默認網路上,所以應該沒問題
- 密碼和用戶名匹配
- POSTGRES_DB 也匹配,默認資料庫應該是 auth-dev
POSTGRES_DB
This optional environment variable can be used to define a different name for the default database that is created when the image is first started. If it is not specified, then the value of POSTGRES_USER will be used.
- 我也禁用了 sslmode
是否還有其他可能導致連接被拒絕的原因?
嘗試將 db 更改為 template1 和 postgres,因為它們是默認創建的,但兩者都不起作用
54511e50369c postgres:14.1-alpine "docker-entrypoint.s…" 16 minutes ago Up 16 seconds 0.0.0.0:5435->5432/tcp, :::5435->5432/tcp auth-db
docker exec -it 54511e50369c psql -U postgres
psql (14.1)
Type "help" for help.
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
----------- ---------- ---------- ------------ ------------ -----------------------
postgres | postgres | UTF8 | en_US.utf8 | en_US.utf8 |
template0 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres
| | | | | postgres=CTc/postgres
(3 rows)
當我嘗試連接時,資料庫已準備就緒(我重試了 20 次,如果它崩潰則重新啟動服務,所以它應該可用)
uj5u.com熱心網友回復:
當您在 docker-compose 中映射埠時,例如"5435:5432",您5435將 HOST 機器5432上的埠映射到 CONTAINER 上。但是,auth-service定義中的 db url 使用的是服務的名稱auth-db,因此您實際上是直接訪問 db 容器,而不是通過主機。因為 db 容器沒有暴露5435,所以您無法使用 port 進行連接5435。例如,如果您嘗試從主機連接到資料庫,您可能會成功使用 port5435和localhost.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/463406.html
標籤:PostgreSQL 码头工人 去 码头工人撰写
上一篇:加入路徑時如何添加斜杠
