You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Celery容器无法连接Minio容器的问题求助及排查详情

Django + Celery + Minio 视频处理连接问题

问题背景

Django应用将视频上传后的resize操作交由Celery Worker处理,媒体文件存储在Minio S3桶中。视频resize过程本身无报错,但Celery无法正常连接Minio容器:

  • 初始错误为连接localhost:9000失败
  • 修改MINIO_STORAGE_MEDIA_URL为http://minio:9000/后,出现403 Forbidden错误

初始Celery错误日志

celery-worker_1  | [2023-07-19 20:51:46,076: INFO/MainProcess] Task common.tasks.resize_video[c38a90eb-793e-4190-a681-94b69eafadc8] received
celery-worker_1  | ffmpeg version 4.3.6-0+deb11u1 Copyright (c) 2000-2023 the FFmpeg developers
celery-worker_1  |   built with gcc 10 (Debian 10.2.1-6)
celery-worker_1  | ffmpeg version 4.3.6-0+deb11u1[tcp @ 0x55c7500727c0]  Copyright (c) 2000-2023 the FFmpeg developers Connection to tcp://localhost:9000 failed: Cannot assign requested address
celery-worker_1  | http://localhost:9000/event_media/test_video.mp4: Cannot assign requested address

docker-compose.yml 配置

postgres:
  image: "postgres:14"
  environment:
    - POSTGRES_USER=user
    - POSTGRES_PASSWORD=password
  volumes:
    - .:/opt/myapp
  ports:
    - "5432:5432"

redis:
  image: redis:6
  ports:
    - "6379:6379"

minio:
  image: minio/minio
  command: minio server /export
  ports:
    - "9000:9000"
  environment:
    - MINIO_ACCESS_KEY=dev_access
    - MINIO_SECRET_KEY=dev_secret

celery-worker:
  build:
    context: .
    dockerfile: ./Dockerfile.celery
  env_file:
    - ./docker.dev.env
  environment:
    - CELERY_BROKER_URL=redis://redis:6379
    - CELERY_RESULT_BACKEND=redis://redis:6379
  depends_on:
    - redis
    - postgres
  command: celery -A myapp worker --loglevel INFO

docker.dev.env 配置

MINIO_STORAGE_ENDPOINT=minio:9000
MINIO_STORAGE_ACCESS_KEY=dev_access
MINIO_STORAGE_SECRET_KEY=dev_secret
MINIO_STORAGE_USE_HTTPS=False
MINIO_STORAGE_MEDIA_BUCKET_NAME=media-dev
MINIO_STORAGE_AUTO_CREATE_MEDIA_BUCKET=True
MINIO_STORAGE_MEDIA_URL=http://localhost:9000/
DEFAULT_FILE_STORAGE=minio_storage.storage.MinioMediaStorage

修改配置后的错误日志

celery-worker_1  | [http @ 0x55698dd429c0] HTTP error 403 Forbidden
celery-worker_1  | http://minio:9000/event_media/test_video.mp4: Server returned 403 Forbidden (access denied)

解决步骤

1. 修正容器间访问地址问题

Docker Compose环境中,容器需通过服务名(而非localhost)互相访问:

  • 保持MINIO_STORAGE_ENDPOINT=minio:9000不变(此配置用于Django/Celery调用Minio API)
  • 将docker.dev.env中的MINIO_STORAGE_MEDIA_URL设置为http://minio:9000/,确保Celery Worker容器内部能解析到Minio服务

2. 解决403权限错误

403通常由签名URL缺失、Bucket权限或密钥不匹配导致:

  • 使用预签名URL访问资源:Minio私有Bucket不允许直接访问,需通过Django存储API生成带签名的临时URL。在Celery任务中替换直接拼接URL的逻辑:
    from django.core.files.storage import default_storage
    
    def resize_video(task_id, video_path):
        # 生成有效期足够的预签名URL(默认有效期3600秒)
        presigned_url = default_storage.url(video_path)
        # 将presigned_url传给FFmpeg进行处理
    
  • 核对密钥一致性:确保docker.dev.env中的MINIO_STORAGE_ACCESS_KEY和MINIO_STORAGE_SECRET_KEY与Minio容器环境变量完全一致(大小写、特殊字符均需匹配)
  • 检查Bucket配置:确认MINIO_STORAGE_MEDIA_BUCKET_NAME=media-dev已被自动创建,且日志中的文件路径event_media/test_video.mp4确实存在于该Bucket下
  • 验证Bucket权限:若需临时测试,可给media-dev Bucket设置公开读权限(生产环境不推荐),但优先使用预签名URL方案

3. 连通性验证

  • 进入Celery Worker容器,测试Minio服务连通性:
    docker exec -it <celery-worker-container-id> ping minio
    
  • 进入Minio容器,确认Bucket状态:
    docker exec -it <minio-container-id> mc ls local
    

内容的提问来源于stack exchange,提问作者kunambi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 16:07:32