如何把乙個Python應用程式裝進Docker

2021-10-25 07:26:51 字數 2841 閱讀 9630

準備

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

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

在深入討論容器之前,讓我們進一步討論一下我們想要封裝的python應用程式。

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

movies.json # movie collection 

requirements.txt # where we specifiy our python dependencies 

import os 

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())

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

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 

from python:3.8.5-slim-buster

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

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

複製應用程式

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

# 2. copy files 

copy . /src

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

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

安裝requirements.txt

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

# 3. install our deps 

run pip install -r /src/requirements.txt

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

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

構建並執行docker映像

# 1. base image 

from python:3.8.3-slim-buster 

# 2. copy files 

copy . /src 

# 3. install our deps 

run pip install -r /src/requirements.txt

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

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...