1、生成requirements.txt
這里使用pipreqs
進(jìn)行依賴庫的識(shí)別。使用 pipreqs 可以自動(dòng)檢索到當(dāng)前項(xiàng)目下的所有組件及其版本,并生成 requirements.txt 文件。相比直接用pip freeze 命令,避免將整個(gè)python環(huán)境的依賴包寫入。
在項(xiàng)目的當(dāng)前目錄中執(zhí)行pipreqs ./ --encoding=utf8 --force
這里使用的是一個(gè)基于flask項(xiàng)目,目錄結(jié)構(gòu)如下
2、編寫dockerfile
dockerfile定義python版本號(hào),將本地項(xiàng)目進(jìn)行拷貝,定義啟動(dòng)命令。
這部分固定流程我們其實(shí)可以抽象出來通過自定義腳本去一鍵生成。這里做一個(gè)簡單的示例。自動(dòng)生成腳本見文末。
# 基于的基礎(chǔ)鏡像
FROM python:3.8.8
# 設(shè)置app文件夾是工作目錄
WORKDIR /usr/src/app
# 先將依賴文件拷貝到項(xiàng)目中
COPY requirements.txt /usr/src/app
# 執(zhí)行指令,安裝依賴
RUN pip install -r requirements.txt
# 拷貝當(dāng)前目錄的項(xiàng)目文件和代碼
COPY . /usr/src/app
# 執(zhí)行命令
CMD [ "python", "/usr/src/app/app.py" ]
3、構(gòu)建鏡像
這里以我自己寫的一個(gè)疫情可視化的flask項(xiàng)目為例,項(xiàng)目名稱為epidemic
docker build -f dockerfile -t epidemic .
這里就是讀取項(xiàng)目目錄下的dockerfile進(jìn)行構(gòu)建-f
4、啟動(dòng)容器
鏡像構(gòu)建完成后使用docker run啟動(dòng)容器,-p指定
docker run -it -p 5001:5000 --name epidemic_container epidemic
-p
指定端口映射,格式為:主機(jī)(宿主)端口:容器端口-i
: 以交互模式運(yùn)行容器,通常與 -t 同時(shí)使用;-t
: 為容器重新分配一個(gè)偽輸入終端,通常與 -i 同時(shí)使用;
運(yùn)行完成后我們就能看到如下界面,這里的控制臺(tái)輸出的就是此時(shí)容器中的flask運(yùn)行控制臺(tái)了。
我們本地訪問我們配置的映射端口即可,瀏覽器輸入127.0.0.1:5001
即可
查看我們剛剛生成的容器。
5、編寫腳本自動(dòng)化完成上述操作
通過腳本去將第二章中的dockerfile設(shè)置為模板,每次只需要自定義鏡像名稱即可,也可直接使用默認(rèn)值。
腳本按如下邏輯依次執(zhí)行
完整代碼如下
import os
import sys
import time
def get_cmd(cmd):
res = os.popen(cmd)
return res.read()
class Generate:
def __init__(self, dockerfile_name="generate.dockerfile", image_name="docker_img"):
self.dockerfile_name = dockerfile_name
self.image_name = image_name
def generate_dockerfile(self, work_dir="/usr/src/app", main_file="app.py"):
# 首先生成dockerfile模板,python版本通過命令行獲取
python_version = sys.version.split(" ")[0]
template = f"""
FROM python:{python_version}
WORKDIR {work_dir}
COPY requirements.txt {work_dir}
RUN pip install -i https://pypi.doubanio.com/simple/ -r requirements.txt
COPY . {work_dir}
CMD [ "python", "{work_dir}/{main_file}" ]
"""
# 檢查requirements.txt文件是否存在,不存在則調(diào)用命令生成生成
if not os.path.exists("requirements.txt"):
print("正在等待requirements.txt文件生成,請(qǐng)稍候....")
os.system("pip install -i https://pypi.doubanio.com/simple/ pipreqs && pipreqs ./ --encoding=utf8 --force")
while not os.path.exists("requirements.txt"):
print("正在等待requirements.txt文件生成...")
time.sleep(2)
# 確定requirements文件生成后,將dockerfile寫入到本地
with open(self.dockerfile_name, "w") as f:
f.write(template)
print(f"dockerfile生成成功,文件名稱為{self.dockerfile_name}")
return True
def build_image(self):
images = get_cmd(f"docker images")
if self.image_name not in images:
cmd = f"docker build -f {self.dockerfile_name} -t {self.image_name} ."
print(cmd)
os.system(cmd)
return self.image_name in images
return False
def run_container(self, container_name, local_port=5001, container_port=5000):
cmd = f"docker run -p {local_port}:{container_port} --name {container_name} {self.image_name}"
#cmd = f"docker run {self.image_name}"
print(cmd)
os.system(cmd)
if __name__ == '__main__':
generate = Generate(dockerfile_name="generate_dockerfile.dockerfile", image_name="epidemic")
generate.generate_dockerfile()
generate.build_image()
generate.run_container(container_name="epidemic_container", local_port=5001, container_port=5000)
運(yùn)行完成后的輸出如下文章來源:http://www.zghlxwxcb.cn/news/detail-400640.html
6、end
如果需要部署示例的這份源碼可以關(guān)注公眾號(hào)"一顆程序樹"在公眾號(hào)菜單進(jìn)行獲取文章來源地址http://www.zghlxwxcb.cn/news/detail-400640.html
到了這里,關(guān)于windows部署python項(xiàng)目(以Flask為例)到docker,通過腳本一鍵生成dockerfile并構(gòu)建鏡像啟動(dòng)容器的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!