我正在尝试创建一个Docker容器,以便能够使用Flask创建一个GUI以利用张量流模型。 事实是,我希望能够实时修改python文件,而不必每次都重建容器。
因此,到目前为止,我已经创建了3个文件:
requirement.txt
Flask
tensorflow
keras
Dockerfile
# Use an official Python runtime as a parent image
FROM python:3.5.6-slim
# Set the working directory to /app
WORKDIR /app
# Copy the current directory contents into the container at /app
ADD . /app
# Install any needed packages specified in requirements.txt
RUN pip install --trusted-host pypi.python.org -r requirements.txt
# Make port 80 available to the world outside this container
EXPOSE 80
# Define environment variable
ENV NAME World
# Run app.py when the container launches
CMD ["python3", "app.py"]
app.py
from flask import Flask
import os
import socket
app = Flask(__name__)
@app.route("/")
def test():
html = "<h3>Hello {name}!</h3>" \
"<b>Hostname:</b> {hostname}<br/>"
return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname())
if __name__ == '__main__':
app.run(host='0.0.0.0', port=80)
所以毕竟,我使用此命令构建容器
docker build -t modelgui .
结束,然后使用此命令运行容器,并在要在主机上修改的应用文件与容器中的应用文件之间建立链接
docker run -p 4000:80 -v /home/Documents/modelGUI:/app modelgui
但是我得到了这个错误,我真的不知道为什么
/usr/local/bin/python3: can't find '__main__' module in 'app.py'
我的问题可能很愚蠢,无法解决,但我真的被困在这里。
答案 0 :(得分:0)
在本地运行此命令,看起来好像是在装入卷覆盖了目录:
docker run -it test_image bash
root@c3870b9845c3:/app# ls
Dockerfile app.py requirements.txt
root@c3870b9845c3:/app# python app.py
* Serving Flask app "app" (lazy loading)
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://0.0.0.0:80/ (Press CTRL+C to quit)
docker run -it -v ~/Barings_VSTS/modelGUI:/app test_image bash
root@f6349f899079:/app# ls
somefile.txt
root@f6349f899079:/app#
这可能是问题的一部分。如果要在其中装载文件系统,我会将其装载到另一个目录中。默认的卷行为是,复制到app
的内容将被modelGUI
的内容覆盖
答案 1 :(得分:0)
检查绑定卷安装中的 / home / Documents / modelGUI 是代码文件所在的路径,并且未创建该路径中的 app.py 作为目录,而不是包含要运行代码的python文件。
如果 / home / Documents / modelGUI 中的 app.py 是目录,则此问题的原因是未调用脚本 app。 py ,您只是给Python解释器提供了一个不存在的脚本名称,如果存在一个类似名称的目录(实际上不区分大小写),它将尝试执行该脚本。
我试图复制:
$ ls -lFs
Dockerfile
app.py/
requirements.txt
然后使用 app.py 调用Python解释器:
$ python3 app.py
/usr/local/bin/python3: can't find '__main__' module in 'app.py'