Python Flask項(xiàng)目在Gitlab CI中自動(dòng)打包Docker鏡像

第一步,在Gitlab中新建一個(gè)項(xiàng)目

第二步,克隆支本地


第三步,本地調(diào)通Python Flask項(xiàng)目

用VSCode打開(kāi)該項(xiàng)目,先用flask在app.py下寫(xiě)了一個(gè)hello world:

from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')

def index():

????return render_template('index.html')

if __name__ == '__main__':

? ??app.run(port=5000, debug=True)

然后在index.html中寫(xiě)下hello world,放在templates目錄下:

<html>

????<head></head>

????<body>

????????<div>Hello World</div>

????</body>

</html>

安裝flask依賴(lài)

pip3 install flask

用以下命令進(jìn)行本地運(yùn)行

python3 app.py

打開(kāi)瀏覽器進(jìn)入localhost:5000即可看到Hello World


本地調(diào)試成功

第四步,本地調(diào)通Docker打包與容器運(yùn)行

于是嘗試?yán)胐ocker打包成鏡像,由于該項(xiàng)目依賴(lài)flask庫(kù),所以在根目錄添加了requirements.txt文件,里面標(biāo)明了依賴(lài)庫(kù)以及相應(yīng)的版本

Flask==2.0.2

然后編寫(xiě)好了Dockerfile

FROM python:3

COPY . /app/

RUN pip install -r /app/requirements.txt

WORKDIR /app

EXPOSE 5000

CMD?["python", "app.py"]

運(yùn)行命令開(kāi)始打包:

docker build -t flask-gitlab-ci-build-docker:latest .

打包成功,運(yùn)行容器:

docker run -d -p 80:5000 flask-gitlab-ci-build-docker:latest

在瀏覽器瀏覽localhost沒(méi)有響應(yīng)

查看日志發(fā)現(xiàn)沒(méi)有報(bào)錯(cuò)


再?lài)L試用瀏覽器打開(kāi)127.0.0.1,也不行


網(wǎng)上搜索發(fā)現(xiàn)python flask在服務(wù)器不能直接運(yùn)行,需要借助gunicorn

于是編寫(xiě)了配置文件gunicorn.conf.py:

workers = 5 # 定義同時(shí)開(kāi)啟的處理請(qǐng)求的進(jìn)程數(shù)量,根據(jù)網(wǎng)站流量適當(dāng)調(diào)整

worker_class = "gevent" # 采用gevent庫(kù),支持異步處理請(qǐng)求,提高吞吐量

bind = "0.0.0.0:5000" # 監(jiān)聽(tīng)I(yíng)P放寬,以便于Docker之間、Docker和宿主機(jī)之間的通信

同時(shí)修改了Dockerfile:

FROM python:3

COPY . /app/

RUN pip install -r /app/requirements.txt

WORKDIR /app

EXPOSE 5000

CMD ["gunicorn", "app:app", "-c", "./gunicorn.conf.py"]

以及修改了依賴(lài)包requirements.txt:

blinker==1.4

Flask==2.0.2

gevent==21.12.0

gunicorn==20.1.0

再打包鏡像、運(yùn)行容器,發(fā)現(xiàn)可以正常運(yùn)作了:

第五步,Gitlab CI設(shè)置腳本自動(dòng)打包Docker鏡像

stages:

? ?- buildAndDeploy

buildAndDeploy:

? stage: buildAndDeploy

??image: docker:latest

? script:

? ? - docker login -u ${docker_registry_username} -p ${docker_registry_password} ${docker_registry_organization_qa}

? ? - docker build -t ${docker_registry_organization_qa}/${docker_registry_project}:$CI_COMMIT_SHORT_SHA .

? ??- docker push ${docker_registry_organization_qa}/${docker_registry_project}:$CI_COMMIT_SHORT_SHA

由于自建Docker鏡像倉(cāng)庫(kù)和賬號(hào)是隱私信息,因此使用Gitlab CI變量代替,再在項(xiàng)目CI/CD設(shè)置內(nèi)賦值

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容