自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

如何把一個(gè)Python應(yīng)用程序裝進(jìn)Docker

開(kāi)發(fā) 后端
容器無(wú)處不在,但是如何在Docker容器中運(yùn)行Python應(yīng)用程序呢?這篇文章將告訴你怎么做!

 準(zhǔn)備

容器無(wú)處不在,但是如何在Docker容器中運(yùn)行Python應(yīng)用程序呢?這篇文章將告訴你怎么做!

[[345462]]

如果您想知道,這些示例需要Python 3.x。

在深入討論容器之前,讓我們進(jìn)一步討論一下我們想要封裝的Python應(yīng)用程序。

這個(gè)應(yīng)用程序是一個(gè)web API,它從一個(gè)電影集合中返回一個(gè)隨機(jī)的電影。在我們的本地文件夾中,我們有3個(gè)文件:

  1. app.py # Python application 
  2. movies.json # movie collection 
  3. requirements.txt # where we specifiy our Python dependencies 

app.py包含一個(gè)API端點(diǎn),它返回一個(gè)隨機(jī)的影片:

 

  1. import os 
  2. import json 
  3. from pathlib import Path 
  4. from random import choice 
  5. import cherrypy 
  6.  
  7. PORT = os.environ.get('PORT', 8888) 
  8.  
  9. FOLDER_PATH = Path(__file__).parent 
  10.  
  11. with open(FOLDER_PATH / "movies.json""r"as f: 
  12.     MOVIES = json.loads(f.read()) 
  13.  
  14. class Movie: 
  15.     @cherrypy.expose 
  16.     @cherrypy.tools.json_out() 
  17.     def index(self): 
  18.         return {"movie": choice(MOVIES)} 
  19.  
  20. cherrypy.quickstart( 
  21.     Movie(), config=cherrypy.config.update({ 
  22.         'server.socket_host''0.0.0.0'
  23.         'server.socket_port': PORT, 
  24.         })) 

requirement.txt,我們有我們的依賴包

 

  1. pip install -r requirements.txt 

我們可以使用python app.py運(yùn)行我們的應(yīng)用程序。

運(yùn)行curl localhost:8888應(yīng)該返回一個(gè)隨機(jī)的影片,類似于:

 

  1.   "movie": { 
  2.     "Title""Opal Dreams"
  3.     "US_Gross": 14443, 
  4.     "Worldwide_Gross": 14443, 
  5.     "US_DVD_Sales"null
  6.     "Production_Budget": 9000000, 
  7.     "Release_Date""Nov 22 2006"
  8.     "MPAA_Rating""PG"
  9.     "Running_Time_min"null
  10.     "Distributor""Strand"
  11.     "Source""Based on Book/Short Story"
  12.     "Major_Genre""Drama"
  13.     "Creative_Type""Contemporary Fiction"
  14.     "Director"null
  15.     "Rotten_Tomatoes_Rating"null
  16.     "IMDB_Rating": 6.5, 
  17.     "IMDB_Votes": 468 
  18.   } 

如何容器化我們的程序

包含一個(gè)Python應(yīng)用程序意味著創(chuàng)建一個(gè)Docker鏡像,其中包含運(yùn)行它所需要的一切:源代碼、依賴項(xiàng)和配置。

容器化應(yīng)用程序的第一步是創(chuàng)建一個(gè)新的文本文件,名為Dockerfile:

 

  1. app.py 
  2. movies.json 
  3. requirements.txt 
  4. Dockerfile 

在Dockerfile(我們認(rèn)為是最小可行Dockerfile)中,我們需要指定三個(gè)步驟:

  • 選擇我們想要使用的基本圖像
  • 選擇我們想要在Docker圖像中復(fù)制的文件
  • 安裝應(yīng)用程序的依賴項(xiàng)

Base image

要指定基本映像,我們使用FROM命令,后面跟著私有或公共映像。

在我們的例子中,我們將使用官方的Python Docker映像,該映像可在Docker hub上使用。

我們將選擇最新可用的基于Ubuntu的python3圖像。

 

  1. # 1. Base image 
  2. FROM python:3.8.5-slim-buster 

圖像名稱由兩個(gè)不同的部分組成:image:tag。在我們的例子中,圖像是python,標(biāo)簽是3.8.5-slim-buster。

這就是第一步所需要的一切。

復(fù)制應(yīng)用程序

要在Docker圖像中復(fù)制我們的應(yīng)用程序,我們將使用copy命令:

 

  1. # 2. Copy files 
  2. COPY . /src 

此命令將指定的文件(或文件夾)復(fù)制到Docker映像中。在我們的例子中,我們希望復(fù)制Docker映像中本地文件夾中/src路徑下的所有可用文件。

值得注意的是,COPY命令的第一部分是相對(duì)于構(gòu)建上下文的路徑,而不是相對(duì)于我們的本地機(jī)器的路徑。

安裝requirements.txt

最后一步是在Docker映像中安裝我們的依賴項(xiàng)。為了實(shí)現(xiàn)這一點(diǎn),我們將使用RUN命令運(yùn)行pip安裝:

 

  1. # 3. Install our deps 
  2. RUN pip install -r /src/requirements.txt 

需要注意的一件事是,requirements.txt的路徑與我們第一次運(yùn)行pip安裝時(shí)不同。

這背后的原因是復(fù)制的文件在映像內(nèi)的/src路徑下。

構(gòu)建并運(yùn)行Docker映像

 

  1. # 1. Base image 
  2. FROM python:3.8.3-slim-buster 
  3.  
  4. # 2. Copy files 
  5. COPY . /src 
  6.  
  7. # 3. Install our deps 
  8. RUN pip install -r /src/requirements.txt 

我們的Dockerfile現(xiàn)在已經(jīng)完成,我們可以使用它來(lái)構(gòu)建Docker映像。為此,我們需要使用docker構(gòu)建命令:

 

  1. docker build -t movie-recommender . 

這個(gè)命令使用當(dāng)前文件夾作為構(gòu)建上下文構(gòu)建一個(gè)名為movie-recommender的Docker圖像。在最后指定我們想要使用的構(gòu)建上下文的路徑)。

現(xiàn)在我們可以使用docker run命令運(yùn)行剛剛構(gòu)建的圖像:

 

  1. docker run movie-recommender python /src/app.py 

該命令將在基于電影推薦圖像的容器中執(zhí)行python /src/app.py。

但是,如果我們嘗試使用curl localhost:8888連接到我們的應(yīng)用程序,我們將會(huì)得到一個(gè)錯(cuò)誤。

這怎么可能?為什么我們不能連接到在容器內(nèi)運(yùn)行的應(yīng)用程序?

原因是我們沒(méi)有將應(yīng)用程序的端口公開(kāi)給本地機(jī)器。我們可以使用-p HostPort:ContainerPort標(biāo)志來(lái)實(shí)現(xiàn)這一點(diǎn)。

因此,讓我們嘗試再次運(yùn)行該命令,這一次指定我們希望在本地公開(kāi)端口8888:

 

  1. docker run -p 8888:8888 movie-recommender python /src/app.py 

然后curl localhost:8888。

 

現(xiàn)在的效果非常好!我們剛剛包含了一個(gè)Python應(yīng)用程序!

責(zé)任編輯:華軒 來(lái)源: Python學(xué)會(huì)
相關(guān)推薦

2011-05-11 10:58:39

iOS

2023-09-21 08:00:00

ChatGPT編程工具

2018-09-13 08:49:08

DockerPythonDjango

2010-08-13 13:05:30

Flex應(yīng)用程序

2011-06-09 09:31:40

Qt 實(shí)例

2023-05-19 08:49:58

SQLAlchemy數(shù)據(jù)庫(kù)

2013-01-11 14:45:43

iOS開(kāi)發(fā)移動(dòng)應(yīng)用iPhone

2009-10-19 14:14:19

OSGi Web應(yīng)用

2021-07-14 17:39:46

ReactRails API前端組件

2011-03-15 19:45:27

Windows Azu

2022-06-07 07:21:19

Python內(nèi)置庫(kù)命令行

2018-11-14 19:00:24

PythonRedis共享單車

2021-08-10 07:41:24

JavaDocker鏡像

2011-03-10 10:20:37

應(yīng)用程序Windows Azu

2011-06-08 10:24:38

Windows Pho 應(yīng)用程序

2011-03-10 10:45:47

Azure“Hello Worl

2012-12-07 10:15:53

IBMdW

2013-05-13 09:31:29

Web App開(kāi)發(fā)WebApp

2011-06-08 10:01:36

Windows Pho 應(yīng)用程序

2022-10-21 14:21:46

JavaScript筆記技能
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)