【问题标题】:create docker image for python web service in windows 10 [closed]在 Windows 10 中为 python Web 服务创建 docker 映像 [关闭]
【发布时间】:2020-06-25 13:03:03
【问题描述】:

我是 Docker 的初学者,我想为我在 Flask 中制作的 Web 服务应用程序创建一个映像。我的 Web 服务文件夹名为 MovieFlix,其中包含我的 webservice.py、一个名为 templates 的文件夹,其中包含 HTML 模板,以及一个 .git 文件,我不知道是否需要包含该文件。这是我第一次使用 Docker,我将在下面列出我的步骤。

我在名为 DockerFolder 的文件夹中创建了一个没有扩展名的 Dockerfile 文件。 在 Dockerfile 中,我写了如下几个步骤:

FROM ubuntu:16.04 //create base image 
MAINTAINER bill <bill@gmailcom>
COPY //this is where I want to copy my web service I believe I should put the complete path of MovieFlix folder?
CMD //I do not know how to run the container or my app 
RUN // I think that here I should install Python and the libraries I need for the Python app 
USER bill 
EXPOSE 80 tcp 

如果您能指导我创建 Docker 映像并运行我的 Python 应用程序,我将不胜感激。提前谢谢!

【问题讨论】:

  • 在没有 Docker 的情况下,您的 Flask 服务是否正常工作?您能告诉我们您现在是如何运行应用程序的(在 Docker 之外)吗?
  • @mabergerx 这是一个简单的烧瓶应用程序。 if name == 'main': app.run(debug=True, host='127.0.0.1', port=5000) 然后我只需点击 url 而我的程序正在运行,我可以通过 ctrl + C 关闭它

标签: python docker flask


【解决方案1】:

你可以这样做:

FROM ubuntu:16.04
MAINTAINER bill <bill@gmailcom>
# Here we copy your API directory to the container
COPY ./MovieFlix /MovieFlix
# Copy the requirements and install
COPY requirements.txt /requirements.txt 
RUN pip install -r /requirements.txt
# Expose your port
EXPOSE 80
# Set the working directory to your main file
WORKDIR "/MovieFlix"
# Run the Flask app like you usually do
CMD ["python", "webservice.py", "--host", "0.0.0.0", "--port", "80"]

请注意,您需要将 Flask 应用程序的运行放入 CMD 语句而不是 RUN 语句中,因为您希望容器在运行映像而不是在构建映像时运行应用程序。

【讨论】:

  • 主机必须是 0.0.0.0 ?因为在我的烧瓶应用程序中我有 127.0.0.1
  • 不,它可以是 localhost,或者您甚至可以将其保留为默认的 Flask 行为
  • 我不明白你代码中的这一行。为什么包含两次movieflix? # 这里我们将你的 API 目录复制到容器中 COPY ./MovieFlix /MovieFlix
  • 这里我们将目录从本地系统复制到容器Reference
  • in COPY ./MovieFlix /MovieFlix 我得到 COPY failed: stat /var/lib/docker/tmp/docker-builder664580866/MovieFlix: no such file or directory
【解决方案2】:

不确定这是否是最好的方法,但我制作的 Docker 图像是从 Python 图像开始的。所以我的 Docker 文件看起来像这样:

FROM python:3.x

MAINTAINER Me

COPY . /app #Copy whole directory where the docker file is to /app directory, I've also seen /usr/app but I guess it's just personal preference.

WORKDIR /app #Switch to the directory you've copied the app to. So you're working from the directory where your app is, makes running files easier.

EXPOSE 80

RUN pip install --no-cache-dir -r requirements.txt #Install required packages

CMD ["python", "./Movieflix/webservice.py"] #Run Python and my python file

从 python 图像开始,您无需自己安装它,无论您使用的是哪个库,尽管在 docker hub 提供的标准 python 图像上运行非常大。如果你能够让它在 python3.x-alpine 上运行,它会小很多,但 alpine 没有很多预安装的包。

如果您的整个应用程序都在 ./Movieflix 目录中,请将 docker 文件放在那里,您可以从 CMD 行中删除 ./Movieflix。

我假设您开始的目录仅包含您的应用程序的内容,而不是您不想复制到图像的其他内容。

RUN pip install --no-cache-dir -r requirements.txt 行将安装您的应用所需的软件包,但您确实需要创建“requirements.txt”文件。如果您使用的是虚拟环境,则可以使用pip freeze &gt; requirements.txt

如果您还没有真正发布端口供您通过 localhost 访问它(如果这就是您想要做的),那么还值得查看此处关于 EXPOSE 的 Docker 文档。

https://docs.docker.com/engine/reference/builder/

如果您不想包含任何文件,则值得使用 .dockerignore 文件。与 .gitignore 类似。

https://docs.docker.com/engine/reference/builder/#dockerignore-file

就我个人而言,我从不包含 git 文件或任何虚拟环境文件。也不要包含您不希望其他人看到的任何内容。

希望有帮助

【讨论】:

  • 所以我复制了 DockerFolder 我有我的 dockerfile 在我有 html 模板和烧瓶应用程序的文件夹中?
  • 是的,我想是的。假设您拥有在 MovieFlix 目录中运行应用程序所需的一切,那么您也可以将 dockerfile 放入 MoveFlix 中。然后COPY . /app 行将复制整个 MoveFlix 文件夹。
  • 当您开始构建映像时,您将使用命令提示符导航到 MovieFlix 目录并运行docker build -t mywebbapp:v1 .,这将使用 dockerfile 来构建映像。或者,您可以使用docker build -t mywebbapp:v1 &lt;pathtoMovieFlix&gt;
猜你喜欢
  • 2022-08-24
  • 2010-12-03
  • 1970-01-01
  • 2014-12-24
  • 2020-07-13
  • 1970-01-01
  • 1970-01-01
  • 2011-08-25
  • 1970-01-01
相关资源
最近更新 更多