準備
容器無處不在,但是如何在docker容器中執行python應用程式呢?這篇文章將告訴你怎麼做!
如果您想知道,這些示例需要python 3.x。
在深入討論容器之前,讓我們進一步討論一下我們想要封裝的python應用程式。
這個應用程式是乙個web api,它從乙個電影集合中返回乙個隨機的電影。在我們的本地資料夾中,我們有3個檔案:
movies.json # movie collection
requirements.txt # where we specifiy our python dependencies
import osrequirement.txt,我們有我們的依賴包import json
from pathlib import path
from random import choice
import cherrypy
port = os.environ.get('port', 8888)
folder_path = path(__file__).parent
with 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
cherrypy.quickstart(
movie(), config=cherrypy.config.update())
pip install -r requirements.txt執行curl localhost:8888應該返回乙個隨機的影片,類似於:
}如何容器化我們的程式
包含乙個python應用程式意味著建立乙個docker映象,其中包含執行它所需要的一切:源**、依賴項和配置。
容器化應用程式的第一步是建立乙個新的文字檔案,名為dockerfile:
movies.json
requirements.txt
dockerfile
在dockerfile(我們認為是最小可行dockerfile)中,我們需要指定三個步驟:
base image
要指定基本映像,我們使用from命令,後面跟著私有或公共映像。
在我們的例子中,我們將使用官方的python docker映像,該映像可在docker hub上使用。
我們將選擇最新可用的基於ubuntu的python3影象。
# 1. base image影象名稱由兩個不同的部分組成:image:tag。在我們的例子中,影象是python,標籤是3.8.5-slim-buster。from python:3.8.5-slim-buster
這就是第一步所需要的一切。
複製應用程式
要在docker影象中複製我們的應用程式,我們將使用copy命令:
# 2. copy files此命令將指定的檔案(或資料夾)複製到docker映像中。在我們的例子中,我們希望複製docker映像中本地資料夾中/src路徑下的所有可用檔案。copy . /src
值得注意的是,copy命令的第一部分是相對於構建上下文的路徑,而不是相對於我們的本地機器的路徑。
安裝requirements.txt
最後一步是在docker映像中安裝我們的依賴項。為了實現這一點,我們將使用run命令執行pip安裝:
# 3. install our deps需要注意的一件事是,requirements.txt的路徑與我們第一次執行pip安裝時不同。run pip install -r /src/requirements.txt
這背後的原因是複製的檔案在映像內的/src路徑下。
構建並執行docker映像
# 1. base image我們的dockerfile現在已經完成,我們可以使用它來構建docker映像。為此,我們需要使用docker構建命令:from python:3.8.3-slim-buster
# 2. copy files
copy . /src
# 3. install our deps
run pip install -r /src/requirements.txt
docker build -t movie-recommender .這個命令使用當前資料夾作為構建上下文構建乙個名為movie-recommender的docker影象。在最後指定我們想要使用的構建上下文的路徑)。
現在我們可以使用docker run命令執行剛剛構建的影象:
但是,如果我們嘗試使用curl localhost:8888連線到我們的應用程式,我們將會得到乙個錯誤。
這怎麼可能?為什麼我們不能連線到在容器內執行的應用程式?
原因是我們沒有將應用程式的埠公開給本地機器。我們可以使用-p hostport:containerport標誌來實現這一點。
因此,讓我們嘗試再次執行該命令,這一次指定我們希望在本地公開埠8888:
然後curl localhost:8888。
現在的效果非常好!我們剛剛包含了乙個python應用程式!
從乙個應用程式挑到另乙個應用程式
背景 假如有a,b兩個程式 當然都得是你自己寫的 想在a程式中判斷b程式是否存在本機上,存在就啟動他,啟動的時候彈出乙個對話方塊,對話方塊的內容是a程式帶過去的。背景到此結束,下面是實現流程。實現 plain view plain copy 這個方法明白人一看就懂,你要是不懂還是先去看基礎教程吧!這...
乙個應用程式例項
在開發一些應用系統的時候,由於程式內在的一些特徵,系統的某些組成子程式只允許執行乙個應用程式例項,以保證業務和資料處理安全。本文將從實際應用角度來分析其實現原理,對三種實現方式進行測試比較,從而確定一種合適的實現方法。文章的例子使用c 語言進行描述。程序匹配 對於每乙個應用程式執行例項都會包含該例項...
如何讓Qt應用程式只有乙個例項
在實際應用中,我們經常需要讓應用程式只有乙個例項,再開啟新的文件或者頁面時,只是替換現在的視窗或者新開啟乙個標籤,而不是重新啟動一次應用程式。qt中是否可以做到這樣呢,答案是肯定的,因為 qt本身可以直接呼叫系統 api,肯定可以做到,但是我們希望找到乙個跨平台的通用的解決方案。這就要用到qt的 q...