基于 pytorch 的 Flask 应用程序映像在运行后退出
Posted
技术标签:
【中文标题】基于 pytorch 的 Flask 应用程序映像在运行后退出【英文标题】:pytorch based Flask app image exits after running 【发布时间】:2021-05-20 20:40:07 【问题描述】:我使用 pytorch 运行了一个 ML 模型并使用 flask 创建了一个应用程序。在我的本地机器和服务器上一切正常。新学的 docker 镜像,希望把所有东西都打包进去。我有 mac 并安装了 docker 桌面。经过多次尝试和配置,基于我创建的图像的容器在完成运行 py 代码后停止。
设置 dockerfile 的代码
FROM python:3.7.9-stretch
RUN apt-get update
WORKDIR /usr/src/App
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
RUN ls -la .
CMD ["python3", "app.py", "--host=0.0.0.0", "--port=8000"]
构建图像的代码:
docker build -t app:v1 .
运行容器的代码:
docker run -p 8000:8000 app:v1
在我的 py 文件中,我还指定了:
if __name__ == "__main__":
app.run(host='0.0.0.0',port=8000, debug=True)
代码运行完毕后,容器退出。
我查看了日志文件,似乎有一些错误,但我认为这不会导致任何事情,因为它在错误之后还说如果我使用 gpu,那么我可以忽略它(我没有使用 gpu)
【问题讨论】:
【参考方案1】:解决日志中的错误。我建议尝试删除主机上的所有 python 图像并检查所有构建的层是否也被删除,而不是尝试使用不同的次要版本的图像。假设来自here 的python:3.7.10-stretch。您的示例代码绝对不会产生这样的错误,有时某些图像只是被他们使用的软件更新破坏了。在这种情况下,python 使用的一些编译软件看起来已损坏。
到容器出口。尝试将最后一行更改为CMD ["python3", "app.py"]
并将参数传递为environment。此时你应该没问题。但我建议将 dipper 挖掘到 docker 中,这个图像需要一些调整。
这里是 CMD 工作原理的大图 - Entrypoint & cmd difference and how it works
Here你可能会找到flask和docker的一个很好的例子
【讨论】:
谢谢你,我试过你的观点2,但也没有用。我尝试了Entrypoint和cmd,问题仍然存在。容器在完成运行 py 文件后立即停止。 好的,请分享您运行以启动 docker 容器和 app.py 的完整命令 感谢@Rkm,经过无数次的尝试,我终于成功了,但仍有一些谜团,我只是把我的发现放在下面,请提供一些想法。非常感谢。【参考方案2】:我通过在我的 .py 文件中删除 debug=True 来解决此问题。之后,容器在运行 .py 文件后不再退出。
我还发现我在如下所示的Dockerfile中放入的“--host=0.0.0.0”、“--port=8000”根本没有用。将它们包含在代码中或根本没有影响。也许有人可以指出为什么在某些在线案例中人们将它们写在他们的 CMD 命令中?
CMD ["python3", "app.py", "--host=0.0.0.0", "--port=8000"]
另外一个有趣的事实发生在我跑步的时候:
App % docker run -p 6000:8000 app:v1
我的mac电脑的6000端口打不开页面。但是如果我在我的 mac 上尝试其他端口,页面会显示。当我一开始尝试 8000:8000 时,也出现了这种情况。然而,在我解决其他问题之后,我的 mac 上的端口 8000 神奇地自行工作,原因很神秘。也许有人可以就这里发生的事情向我提供一些想法。
【讨论】:
CMD ["python3", "app.py", "--host=0.0.0.0", "--port=8000"] 表示:Python运行应用程序app.py并通过- -host 和该应用程序的 --port 参数。由你的 app.py 来处理这些参数。如果您的应用不处理这些标志,则无需将它们添加到 CMD。 谢谢@camba1,CMD 中的--port=8000 是本地主机上的端口还是docker 内部的端口?在我的 py 代码中,我有 app.run(host='0.0.0.0',port=8000)。我应该什么时候在 py 代码中分配端口与在 dockerfile CMD 中分配端口? 我刚刚打开了另一个问题,@ camba1 请随时在那里回答。 ***.com/questions/66269187/…以上是关于基于 pytorch 的 Flask 应用程序映像在运行后退出的主要内容,如果未能解决你的问题,请参考以下文章
Pytorch CUDA 错误:没有内核映像可用于在带有 cuda 11.1 的 RTX 3090 上的设备上执行
Bamboo - Docker 映像运行错误 - 连接被拒绝
使用flask在heroku bert pytorch模型上部署:错误:_pickle.UnpicklingError:无效的加载键,'v'