python-3.x - 从 Docker 容器中的 Python 文件执行时,子进程找不到文件
问题描述
我创建了一个简单的 Flask 应用程序,我正在尝试将其部署到 Docker。
基本用户界面将在 localhost 上加载,但是当我执行调用特定函数的命令时,它一直显示:
“内部服务器错误服务器遇到内部错误,无法完成您的请求。服务器过载或应用程序出错。”
查看 Docker 日志我可以看到问题是 subprocess.popen 命令找不到该文件:
“FileNotFoundError:[Errno 2] 没有这样的文件或目录:'test_2.bat':'test_2.bat'172.17.0.1 - - [31/Oct/2019 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 - - [31/Oct/2019 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”通过命令行在本地执行时,该应用程序完全按照预期工作
解决方案
如果有人遇到类似问题,解决方案是将命令直接放入 Python 脚本中,而不是在单独的文件中调用它。它被拆分为单独的字符串,以允许迭代更新“url”变量,因为这一切都发生在 for 循环中:
url = str(i)
var_command = "lighthouse " + url + " --quiet --chrome-flags=\" --headless\" --output=json output-path=/home/lighthouse/result.json"
item = subprocess.Popen([var_command], stdout=subprocess.PIPE, shell=True)
item.communicate()
附带说明一下,如果您想在容器中运行 Lighthouse,您需要像在命令行上运行它一样在 Node 容器中安装它。如果这两个容器都通过 Kubernetes 部署在同一个 pod 中并共享一个命名空间,那么这个容器就可以与我的 Python 容器通信。这是我使用过的 Lighthouse 容器 Dockerfile:https ://github.com/GoogleChromeLabs/lighthousebot/blob/master/builder/Dockerfile
推荐阅读
- c++ - Why is there a running error on leetcode and no error on vs2019?
- c++ - 如何在类中声明和初始化静态成员?
- java - 在快速排序中使用最后一个元素作为枢轴时无法解决错误
- r - 如何使用 dplyr::rename 为 !%in% 列表的 data.frame 列名添加前缀?
- java - 如何根据Java中给定的一组比较器对作为字符串的树形图键进行排序
- python - excel合并两个单元格
- angular - 在 ng2-dragula 上禁用/不提供一些放置位置
- python - 如何使用直方图绘制状态密度 DOS?
- objective-c - 在 webview 中右键单击可可重命名默认上下文菜单标题 [Objective C]
- python - TypeError:'int'对象不可调用-Python函数