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

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:用环境变量传递端口(更灵活)

如果希望保留原代码的严格校验逻辑,可通过环境变量传递端口:

  1. 修改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)
  1. 修改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

验证步骤

  1. 重新构建Docker镜像:
docker build -t userapi_img_ad -f ./project/docker/Dockerfile .
  1. 执行修改后的startdocker.sh启动容器
  2. 查看容器日志确认服务正常启动:
docker logs userapi_cnt_ad
  1. 访问API测试可用性:
curl http://localhost:25556

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 15:14:51