From d5f354b28bd6dd8eb913baa80f3013c016f8d056 Mon Sep 17 00:00:00 2001 From: RichZDS <3388214266@qq.com> Date: Wed, 4 Feb 2026 14:52:59 +0800 Subject: [PATCH] =?UTF-8?q?docker=E5=88=86=E5=88=AB=E9=83=A8=E7=BD=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/server/main.go | 25 ++++++++++++++++--- docker-compose.yml | 62 ++++++---------------------------------------- 2 files changed, 29 insertions(+), 58 deletions(-) diff --git a/cmd/server/main.go b/cmd/server/main.go index c3188e6..2bf1708 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -8,17 +8,36 @@ import ( "net/http" "os" "path/filepath" + "time" ) func main() { // 1. 初始化 RabbitMQ rabbitmqURL := os.Getenv("RABBITMQ_URL") if rabbitmqURL == "" { - rabbitmqURL = "amqp://guest:guest@localhost:5672/" + // 默认使用本地 Docker 启动的 RabbitMQ 配置 (admin/1218Zhengyaqi) + rabbitmqURL = "amqp://admin:1218Zhengyaqi@localhost:5672/" } - rmq, err := rabbitmq.NewClient(rabbitmqURL) + + var rmq *rabbitmq.Client + var err error + maxRetries := 30 + for i := 0; i < maxRetries; i++ { + rmq, err = rabbitmq.NewClient(rabbitmqURL) + if err == nil { + break + } + // 如果是 403 认证错误,重试也没用,直接报错退出 + if err.Error() == "Exception (403) Reason: \"username or password not allowed\"" { + log.Fatalf("RabbitMQ 认证失败,请检查账号密码: %v", err) + } + + log.Printf("RabbitMQ 连接失败 (尝试 %d/%d): %v, 2秒后重试...", i+1, maxRetries, err) + time.Sleep(2 * time.Second) + } + if err != nil { - log.Fatalf("RabbitMQ 连接失败: %v", err) + log.Fatalf("RabbitMQ 连接最终失败: %v", err) } defer rmq.Close() diff --git a/docker-compose.yml b/docker-compose.yml index 0561639..295379b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -9,60 +9,12 @@ services: - "2779:2779" environment: - PORT=2779 - - RABBITMQ_HOST=rabbitmq - - RABBITMQ_USER=admin - - RABBITMQ_PASS=1218Zhengyaqi - - RABBITMQ_URL=amqp://admin:1218Zhengyaqi@rabbitmq:5672/ - - REDIS_ADDR=redis:6379 # 确保环境变量正确传递 - depends_on: - rabbitmq: - condition: service_healthy # 等待 RabbitMQ 健康 - redis: - condition: service_healthy # 等待 Redis 健康 + # 使用 host.docker.internal 连接宿主机上的 RabbitMQ 和 Redis + - RABBITMQ_URL=amqp://admin:1218Zhengyaqi@host.docker.internal:5672/ + - REDIS_ADDR=host.docker.internal:6379 + # 移除 depends_on,因为依赖的是外部服务 restart: unless-stopped - networks: - - chatroom-net + extra_hosts: + - "host.docker.internal:host-gateway" # 确保 Linux 环境下也能解析(虽然 Windows 通常自带,加上更保险) - rabbitmq: - image: rabbitmq:3-management-alpine - container_name: chatroom-rabbitmq - ports: - - "5672:5672" - - "15672:15672" - environment: - RABBITMQ_DEFAULT_USER: admin - RABBITMQ_DEFAULT_PASS: 1218Zhengyaqi # ← 必须和上面一致! - healthcheck: - test: ["CMD", "rabbitmq-diagnostics", "-q", "check_running"] - interval: 10s - timeout: 5s - retries: 5 - volumes: - - rabbitmq_data:/var/lib/rabbitmq - restart: unless-stopped - networks: - - chatroom-net - - redis: - image: redis:alpine - container_name: chatroom-redis - ports: - - "6379:6379" - volumes: - - redis_data:/data - healthcheck: - test: ["CMD", "redis-cli", "ping"] - interval: 5s - timeout: 3s - retries: 5 - restart: unless-stopped - networks: - - chatroom-net - -networks: - chatroom-net: - driver: bridge - -volumes: - rabbitmq_data: - redis_data: \ No newline at end of file +# 移除 RabbitMQ 和 Redis 服务定义,直接使用外部容器 \ No newline at end of file