首頁>技術>

準備

容器無處不在,但是如何在Docker容器中執行Python應用程式呢?這篇文章將告訴你怎麼做!

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

這個應用程式是一個web API,它從一個電影集合中返回一個隨機的電影。在我們的本地資料夾中,我們有3個檔案:

app.py # Python applicationmovies.json # movie collectionrequirements.txt # where we specifiy our Python dependencies

app.py包含一個API端點,它返回一個隨機的影片:

import osimport jsonfrom pathlib import Pathfrom random import choiceimport cherrypyPORT = os.environ.get('PORT', 8888)FOLDER_PATH = Path(__file__).parentwith open(FOLDER_PATH / "movies.json", "r") as f: MOVIES = json.loads(f.read())class Movie: @cherrypy.expose @cherrypy.tools.json_out() def index(self): return {"movie": choice(MOVIES)}cherrypy.quickstart( Movie(), config=cherrypy.config.update({ 'server.socket_host': '0.0.0.0', 'server.socket_port': PORT, }))

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

pip install -r requirements.txt

我們可以使用python app.py執行我們的應用程式。

執行curl localhost:8888應該返回一個隨機的影片,類似於:

{ "movie": { "Title": "Opal Dreams", "US_Gross": 14443, "Worldwide_Gross": 14443, "US_DVD_Sales": null, "Production_Budget": 9000000, "Release_Date": "Nov 22 2006", "MPAA_Rating": "PG", "Running_Time_min": null, "Distributor": "Strand", "Source": "Based on Book/Short Story", "Major_Genre": "Drama", "Creative_Type": "Contemporary Fiction", "Director": null, "Rotten_Tomatoes_Rating": null, "IMDB_Rating": 6.5, "IMDB_Votes": 468 }}
如何容器化我們的程式

包含一個Python應用程式意味著建立一個Docker映象,其中包含執行它所需要的一切:原始碼、依賴項和配置。

容器化應用程式的第一步是建立一個新的文字檔案,名為Dockerfile:

app.pymovies.jsonrequirements.txtDockerfile

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

Base image

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

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

我們將選擇最新可用的基於Ubuntu的python3影象。

# 1. Base imageFROM python:3.8.5-slim-buster

影象名稱由兩個不同的部分組成:image:tag。在我們的例子中,影象是python,標籤是3.8.5-slim-buster。

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

複製應用程式

要在Docker影象中複製我們的應用程式,我們將使用copy命令:

# 2. Copy filesCOPY . /src

此命令將指定的檔案(或資料夾)複製到Docker映像中。在我們的例子中,我們希望複製Docker映像中本地資料夾中/src路徑下的所有可用檔案。

值得注意的是,COPY命令的第一部分是相對於構建上下文的路徑,而不是相對於我們的本地機器的路徑。

安裝requirements.txt

最後一步是在Docker映像中安裝我們的依賴項。為了實現這一點,我們將使用RUN命令執行pip安裝:

# 3. Install our depsRUN pip install -r /src/requirements.txt

需要注意的一件事是,requirements.txt的路徑與我們第一次執行pip安裝時不同。

這背後的原因是複製的檔案在映像內的/src路徑下。

構建並執行Docker映像
# 1. Base imageFROM python:3.8.3-slim-buster# 2. Copy filesCOPY . /src# 3. Install our depsRUN pip install -r /src/requirements.txt

我們的Dockerfile現在已經完成,我們可以使用它來構建Docker映像。為此,我們需要使用docker構建命令:

docker build -t movie-recommender .

這個命令使用當前資料夾作為構建上下文構建一個名為movie-recommender的Docker影象。在最後指定我們想要使用的構建上下文的路徑)。

現在我們可以使用docker run命令執行剛剛構建的影象:

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

該命令將在基於電影推薦影象的容器中執行python /src/app.py。

但是,如果我們嘗試使用curl localhost:8888連線到我們的應用程式,我們將會得到一個錯誤。

這怎麼可能?為什麼我們不能連線到在容器內執行的應用程式?

原因是我們沒有將應用程式的埠公開給本地機器。我們可以使用-p HostPort:ContainerPort標誌來實現這一點。

因此,讓我們嘗試再次執行該命令,這一次指定我們希望在本地公開埠8888:

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

然後curl localhost:8888。

現在的效果非常好!我們剛剛包含了一個Python應用程式!

英文原文:

https://www.pybootcamp.com/blog/how-to-containerize-python-application/

最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 無邊界辦公——WebDAV檔案共享服務構建