Flask API Docker部署端口问题:参数未传递导致启动报错
解决Flask API Docker部署的端口参数问题
问题现象
部署Flask的userapi服务到Docker时,执行startdocker.sh脚本后始终报错:
ValueError: No starting port for the application
硬编码端口可正常运行,但需要支持动态指定端口以完成多端口测试。
问题根源分析
userapi代码逻辑限制
当前代码强制要求通过命令行参数传入端口,无参数时直接抛出异常:
if __name__ == "__main__": if len(sys.argv) >= 2: try: app_port = int(sys.argv[1]) except ValueError as ve: app_port = 5558 app.run(debug=True, host='0.0.0.0', port=app_port) else: raise ValueError('No starting port for the application')
Docker配置缺失端口传递
- Dockerfile的
CMD仅传递启动脚本和Python文件,未携带端口参数:# 不想分享我的FROM语句 COPY ./requirements.txt / RUN pip3 install -r /requirements.txt WORKDIR /mnt/app/ CMD ["./run.sh", "./project/main/userapi.py"] startdocker.sh的docker run命令未向容器内部传递任何端口参数。
解决方案
方案1:优化代码,支持多渠道端口配置
修改userapi启动逻辑,优先读取命令行参数,其次读取环境变量,最后使用默认值,避免无参数时直接抛错:
import os import sys from flask import Flask app = Flask(__name__) # ... 其他业务代码 ... if __name__ == "__main__": app_port = 5558 # 默认端口 # 优先处理命令行参数 if len(sys.argv) >= 2: try: app_port = int(sys.argv[1]) except ValueError: pass # 参数无效时保留默认值 else: # 从环境变量获取端口 port_env = os.getenv("FLASK_PORT") if port_env: try: app_port = int(port_env) except ValueError: pass # 环境变量无效时保留默认值 app.run(debug=True, host='0.0.0.0', port=app_port)
方案2:调整Docker配置,传递命令行端口参数
修改Dockerfile
使用ENTRYPOINT配合CMD,让容器启动时可接收端口参数:
# 不想分享我的FROM语句 COPY ./requirements.txt / RUN pip3 install -r /requirements.txt WORKDIR /mnt/app/ ENTRYPOINT ["python3", "./project/main/userapi.py"] CMD ["5558"] # 默认端口参数
更新startdocker.sh
在docker run时传入与端口映射一致的容器内部端口:
#!/bin/bash docker container stop userapi_cnt_ad docker container rm userapi_cnt_ad docker image rm userapi_img_ad docker volume rm ad_vol docker volume create --name ad_vol --opt device=/mnt/share/ad-infra-tp-2-h-2024 --opt o=bind --opt type=none docker build -t userapi_img_ad -f ./project/docker/Dockerfile . # 传递5556作为容器内启动端口,对应外部映射的25556 docker run -p 25556:5556 --mount source=ad_vol,target=/mnt/app --name userapi_cnt_ad userapi_img_ad 5556
方案3:用环境变量传递端口(更灵活)
如果希望保留原代码的严格校验逻辑,可通过环境变量传递端口:
- 修改userapi代码,从环境变量读取端口:
import os import sys from flask import Flask app = Flask(__name__) # ... 其他业务代码 ... if __name__ == "__main__": port_env = os.getenv("FLASK_PORT") if not port_env: raise ValueError('No starting port for the application') try: app_port = int(port_env) except ValueError: raise ValueError('Invalid port number') app.run(debug=True, host='0.0.0.0', port=app_port)
- 修改startdocker.sh,添加环境变量参数:
docker run -p 25556:5556 -e FLASK_PORT=5556 --mount source=ad_vol,target=/mnt/app --name userapi_cnt_ad userapi_img_ad
验证步骤
- 重新构建Docker镜像:
docker build -t userapi_img_ad -f ./project/docker/Dockerfile .
- 执行修改后的
startdocker.sh启动容器 - 查看容器日志确认服务正常启动:
docker logs userapi_cnt_ad
- 访问API测试可用性:
curl http://localhost:25556
内容的提问来源于stack exchange,提问作者LADsy8
相关产品推荐
相关产品推荐

