準備
容器無處不在,但是如何在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/