当前位置: 首页 > 科技观察

如何将Python应用程序加载到Docker

时间:2023-03-20 10:57:05 科技观察

就绪容器无处不在,但是如何在Docker容器中运行Python应用程序呢?这篇文章将告诉你如何!如果您想知道,这些示例需要Python3.x。在深入探讨容器之前,让我们多谈谈我们要打包的Python应用程序。该应用程序是一个WebAPI,可从电影集合中返回随机电影。在我们的本地文件夹中,我们有3个文件:app.py#Pythonapplicationmovies.json#moviecollectionrequirements.txt#wherewespecifiyourPythondependenciesapp.py包含一个返回随机电影的API端点:importosimportjsonfrompathlibimportPathfromrandomimportchoiceimportcherrypyPORT=os.environ.get('PORT',8888)FOLDER_PATH=路径(__file__).parentwithopen(FOLDER_PATH/"movies.json","r")asf:MOVIES=json.loads(f.read())classMovie:@cherrypy.expose@cherrypy.tools.json_out()defindex(self):return{"movie":choice(MOVIES)}cherrypy.quickstart(Movie(),config=cherrypy.config.update({'server.socket_host':'0.0.0.0','server.socket_port':PORT,}))requirements.txt,我们有我们的依赖包pipinstall-rrequirements.txt我们可以使用pythonapp.py来运行我们的应用程序。运行curllocalhost:8888应该返回类似于以下内容的随机电影:{"movie":{"Title":"OpalDreams","US_Gross":14443,"Worldwide_Gross":14443,"US_DVD_Sales":null,"Production_Budget":9000000,"Release_Date":"Nov222006","MPAA_Rating":"PG","Running_Time_min":null,"Distributor":"Strand","Source":"BasedonBook/ShortStory","Major_Genre":"Drama","Creative_Type":"ContemporaryFiction","Director":null,"Rotten_Tomatoes_Rating":null,"IMDB_Rating":6.5,"IMDB_Votes":468}}如何容器化我们的程序包含一个Python应用程序意味着创建一个Docker镜像,其中包含运行它所需的一切:源代码、依赖项和配置。容器化应用程序的第一步是创建一个名为Dockerfile的新文本文件:app.pymovies.jsonrequirements.txtDockerfile在Dockerfile(我们认为是MinimumViableDockerfile)中,我们需要指定三个步骤:选择我们想要的要使用的基础图像选择我们要在Docker图像中复制的文件安装应用程序的依赖关系基础图像要指定基础图像,我们使用FROM命令,后跟私有或公共图像。在我们的例子中,我们将使用Dockerhub上提供的官方PythonDocker镜像。我们将选择最新可用的基于Ubuntu的python3映像。#1.BaseimageFROMpython:3.8.5-slim-buster镜像名称由两部分组成:image:tag。在我们的例子中,图像是python,标签是3.8.5-slim-buster。这就是第一步所需的全部内容。复制应用程序要在Docker镜像中复制我们的应用程序,我们将使用复制命令:#2.CopyfilesCOPY./src此命令将指定的文件(或文件夹)复制到Docker镜像中。在我们的例子中,我们想要复制Docker镜像本地文件夹中/src路径下的所有可用文件。值得注意的是,COPY命令的第一部分是相对于构建上下文的路径,而不是我们本地机器的路径。安装requirements.txt最后一步是在Docker镜像中安装我们的依赖项。为此,我们将使用RUN命令运行pipinstall:#3.InstallourdepsRUNpipinstall-r/src/requirements.txt需要注意的是requirements.txt的路径与我们第一次运行pipinstall时不同.这背后的原因是复制的文件位于图像内的/src路径下。构建并运行Docker镜像#1.BaseimageFROMpython:3.8.3-slim-buster#2.CopyfilesCOPY./src#3.InstallourdepsRUNpipinstall-r/src/requirements.txt我们的Dockerfile现已完成,我们可以使用它来构建Docker图像。为此,我们需要使用dockerbuild命令:dockerbuild-tmovie-recommender。此命令使用当前文件夹作为构建上下文来构建名为movie-recommender的Docker映像。最后指定我们要使用的构建上下文的路径)。现在我们可以使用dockerrun命令运行刚刚构建的镜像:dockerrunmovie-recommenderpython/src/app.py该命令将根据电影推荐镜像在容器中执行python/src/app.py。但是,如果我们尝试使用curllocalhost:8888连接到我们的应用程序,则会出现错误。这怎么可能?为什么我们无法连接到容器内运行的应用程序?原因是我们没有将应用程序的端口暴露给本地机器。我们可以通过使用-pHostPort:ContainerPort标志来实现这一点。因此,让我们再次尝试运行该命令,这次指定我们要在本地公开端口8888:dockerrun-p8888:8888movie-recommenderpython/src/app.py然后curllocalhost:8888。现在效果很好!我们刚刚包含了一个Python应用程序!