【发布时间】:2019-10-31 17:17:33
【问题描述】:
我创建了一个简单的 Flask 应用程序,我正在尝试将其部署到 Docker。
基本用户界面会在 localhost 上加载,但是当我执行调用特定函数的命令时,它一直显示:
"内部服务器错误 服务器遇到内部错误,无法完成您的请求。要么是服务器超载,要么是应用程序出错。”
查看Docker日志我可以看到问题是subprocess.popen命令找不到文件:
“FileNotFoundError: [Errno 2] 没有这样的文件或目录: 'test_2.bat': 'test_2.bat' 172.17.0.1 - - [2019 年 10 月 31 日 17:01:55] "POST /login HTTP/1.1" 500"
该文件肯定存在于 Docker 环境中,在容器中我可以看到它在根目录中列出。
我也尝试过改变:
item = subprocess.Popen(["test_2.bat", i], shell=False,stdout=subprocess.PIPE)
到:
item = subprocess.Popen(["./test_2.bat", i], shell=False,stdout=subprocess.PIPE)
产生了替代错误:
"OSError: [Errno 8] 执行格式错误: './test_2.bat' 172.17.0.1 - - [2019 年 10 月 31 日 16:58:54] "POST /login HTTP/1.1" 500"
我在 Flask 应用程序涉及的两个 .py 文件的顶部添加了一个 shebang(尽管我可能做错了):
#!/usr/bin/env python3
这是 Dockerfile:
FROM python:3.6
RUN adduser lighthouse
WORKDIR /home/lighthouse
COPY requirements.txt requirements.txt
# RUN python -m venv venv
RUN pip install -r requirements.txt
RUN pip install gunicorn
COPY templates templates
COPY json_logs_nl json_logs_nl
COPY app.py full_script_manual_with_list.py schema_all.json ./
COPY bq_load_indv_jsons_v3.bat test_2.bat ./
RUN chmod 644 app.py
RUN pip install flask
ENV FLASK_APP app.py
RUN chown -R lighthouse:lighthouse ./
USER lighthouse
# EXPOSE 5000
CMD ["flask", "run", "--host=0.0.0.0"]
我正在使用 Ubuntu 和 WSL2 在没有虚拟机的 Windows 机器上运行 Docker。我在浏览我的 Windows 文件系统或构建 Docker 映像时没有问题,所以我认为这个配置不是问题 - 但以防万一。
如果有人有任何想法可以帮助子进程找到 test_2.bat,我将不胜感激!
编辑:当使用“flask run”通过命令行在本地执行时,应用程序的工作方式完全符合预期
【问题讨论】:
-
Linux 环境一般不运行
.bat文件。您能否将该逻辑转换为可移植的 Python 并避免子流程调用? -
嗨,David,我不熟悉可移植 Python,但批处理脚本调用工具中有一些命令行调用没有 Python API。你认为如果我将批处理文件的内容翻译成 .sh 文件可以吗?
标签: python-3.x windows docker subprocess ubuntu-18.04