从Docker容器中的Python文件执行时,子进程找不到文件

时间:2019-10-31 17:17:33

标签: python-3.x windows docker subprocess ubuntu-18.04

我创建了一个简单的Flask应用,试图将其部署到Docker。

基本用户界面将在localhost上加载,但是当我执行调用特定功能的命令时,它会不断显示:

“内部服务器错误 服务器遇到内部错误,无法完成您的请求。服务器超载或应用程序中有错误。“

查看Docker日志,我可以看到问题是subprocess.popen命令找不到该文件:

“ FileNotFoundError:[错误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] Exec格式错误:'./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”在本地执行时,完全可以按预期运行

1 个答案:

答案 0 :(得分:0)

如果有人遇到类似问题,解决方案是将命令直接放入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部署在同一容器中并共享一个命名空间,则该容器可以与我的Python容器通信。这是我使用过的Lighthouse容器Dockerfile:https://github.com/GoogleChromeLabs/lighthousebot/blob/master/builder/Dockerfile