Docker部署aiogram Telegram Bot遇Errno 99地址绑定错误求助
解决Docker部署aiogram Webhook时的绑定错误
问题现象
部署基于aiogram的Telegram Bot到Docker Compose环境时,出现以下绑定地址错误:
app_1 | OSError: [Errno 99] error while attempting to bind on address ('::1', 3001, 0, 0): cannot assign requested address
本地非Docker环境运行正常,问题出在Docker容器的网络配置上。
解决方案
1. 修改Web服务绑定地址
在main.py中,将WEBAPP_HOST从localhost改为0.0.0.0:
# webserver settings WEBAPP_HOST = '0.0.0.0' # 绑定到容器所有可用网络接口 WEBAPP_PORT = 3001
原因:Docker容器内的localhost仅指向容器自身回环接口,绑定0.0.0.0才能让其他容器(如Nginx)访问到Bot的Web服务。
2. 修正Nginx代理配置
修改nginx.conf中的proxy_pass地址,使用Docker Compose的服务名app而非127.0.0.1,同时匹配Bot服务的端口3001:
server { listen 443 ssl; server_name MySite.com; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_certificate /etc/letsencrypt/live/Mysite.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/MySite.com/privkey.pem; location / { proxy_pass http://app:3001; # 使用app服务名和对应端口 proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $server_name; } } server { if ($host = MySite.com) { return 301 https://$host$request_uri; } listen 80; server_name MySite.com; return 404; }
原因:Docker Compose中各服务通过服务名互相访问,Nginx容器无法直接访问宿主机的127.0.0.1,必须用服务名app访问Bot容器。
3. 修复数据库连接地址
修改Dockerfile中的DB_STRING,将localhost替换为PostgreSQL服务名db:
FROM python ENV DB_STRING=postgresql+psycopg2://user1:12345@db:5432/db01 # 使用db服务名 RUN apt-get update \ && apt-get install -y git \ && git clone https://github.com/...My repository... WORKDIR /tele/telebot RUN pip install -r requirements.txt CMD python3 -u main.py
原因:PostgreSQL运行在db容器中,Bot容器需通过服务名db访问数据库,而非localhost。
4. 调整Docker Compose依赖关系
修改docker-compose.yaml,调整服务依赖顺序(Nginx依赖app,而非app依赖Nginx),并添加必要的配置挂载:
version: '3.3' services: redis: image: redis restart: always app: build: . restart: always depends_on: - redis - db environment: - ... celery_worker: build: . restart: always depends_on: - redis - app - db command: ['celery', '-A', 'celery_app', 'worker', '--loglevel=DEBUG'] environment: - ... db: image: postgres restart: always environment: - ... nginx: image: nginx restart: always depends_on: - app # Nginx需等待app服务启动 ports: - "80:80" - "443:443" volumes: - ./nginx.conf:/etc/nginx/conf.d/default.conf # 挂载自定义配置 - ./ssl:/etc/letsencrypt/live/MySite.com # 挂载SSL证书(确保本地路径正确)
说明:
- app服务无需暴露端口,仅Nginx容器内部访问即可
- 挂载Nginx配置和SSL证书,确保配置生效
- 调整依赖顺序,避免服务启动时序错误
验证步骤
- 重新构建镜像:
docker-compose build - 启动服务:
docker-compose up -d - 查看日志:
docker-compose logs app,确认服务正常启动 - 测试Webhook连接,验证Telegram Bot功能
内容的提问来源于stack exchange,提问作者4SadMemeXD
相关产品推荐
相关产品推荐

