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

Flask+Docker容器化后执行Bash脚本及Swagger更新异常问题

Flask API容器化部署常见问题排查方案

问题1:Popen执行Shell命令报错/bin/sh: 1: /path No such file or directory

问题表现

本地运行时通过subprocess.Popen调用Shell命令的逻辑运行正常,Docker容器化部署后脚本执行失败,返回路径不存在类错误。

排查解决步骤

  • 修正命令语法错误
    原执行代码存在引号不匹配问题:echo server_info.js"多了一个无匹配的闭合双引号,本地环境可能因Shell配置容错偶然运行成功,容器内精简版/bin/sh会直接解析失败。另外shell=True参数下不需要给Popen传列表参数,直接传完整命令字符串即可,同时建议用shlex.quote做参数转义规避命令注入风险,修正后代码参考:
    from subprocess import Popen, PIPE
    import shlex
    safe_cmd = shlex.quote(cmd)
    session = Popen(f"echo server_info.js | node {safe_cmd}", shell=True, stdout=PIPE, stderr=PIPE)
    
  • 补全容器内运行依赖
    使用的基础镜像python:3.7默认不预装Node.js运行时,容器内找不到node命令时也会抛出路径不存在错误。需要在Dockerfile中补充Node.js安装逻辑,修改后Dockerfile参考:
    FROM python:3.7
    # 安装Node.js依赖,清理apt缓存减小镜像体积
    RUN apt-get update && apt-get install -y --no-install-recommends nodejs && rm -rf /var/lib/apt/lists/*
    
    RUN mkdir /usr/src/app
    WORKDIR /usr/src/app
    COPY . /usr/src/app
    RUN pip3 install --trusted-host pypi.python.org -r requirements.txt
    EXPOSE 5000
    ENTRYPOINT ["python3", "/usr/src/app/app.py"]
    
  • 使用容器内绝对路径
    容器文件系统和宿主机完全隔离,不要使用宿主机本地路径、相对路径拼接执行命令,所有脚本、执行文件路径统一写容器内的绝对路径,比如存放在项目根目录的脚本路径写为/usr/src/app/server_info.js,避免路径解析错位。
  • 校验执行权限
    如果Dockerfile中配置了非root用户运行进程,需要提前给待执行脚本、Node.js二进制文件配置对应可读、可执行权限。

问题2:Swagger页面修改swagger.json后不更新

问题表现

容器化部署后Swagger页面可正常访问,但修改本地swagger.json文件后,页面加载的文档内容不会同步更新。

排查解决步骤

  • 明确镜像文件拷贝机制
    当前Dockerfile中COPY . /usr/src/app是镜像构建阶段的操作,构建完成后镜像内的文件是固定快照,后续修改宿主机本地文件不会自动同步到已经启动的容器中。
    • 生产环境:修改文件后重新执行docker build构建新镜像,替换旧容器即可
    • 开发调试环境:启动容器时挂载本地项目目录到容器工作目录实现热更新,启动命令参考:
      docker run -d -p 5000:5000 -v $(pwd):/usr/src/app 你的镜像名称
      
  • 关闭静态文件缓存
    Flask默认对static目录下的资源设置缓存时间,浏览器也会对静态json资源做本地缓存,会导致修改后加载旧文件。可以在Flask初始化配置中关闭静态文件缓存:
    app.config['SEND_FILE_MAX_AGE_DEFAULT'] = 0
    
    调试阶段也可以直接清空浏览器缓存、用强制刷新(Ctrl+F5)验证是否是缓存导致的不同步。
  • 校验文件路径
    确认swagger.json实际存放路径和配置一致:当前配置中API_URL为/static/swagger.json,需要保证文件存放在项目根目录的static文件夹下,避免路径错位加载到历史残留的旧文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 09:54:30