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-devBucket设置公开读权限(生产环境不推荐),但优先使用预签名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
相关产品推荐
相关产品推荐

