第一步,在Gitlab中新建一個項目

第二步,克隆支本地

第三步,本地調通Python Flask項目
用VSCode打開該項目,先用flask在app.py下寫了一個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中寫下hello world,放在templates目錄下:
<html>
????<head></head>
????<body>
????????<div>Hello World</div>
????</body>
</html>
安裝flask依賴
pip3 install flask
用以下命令進行本地運行
python3 app.py
打開瀏覽器進入localhost:5000即可看到Hello World

本地調試成功
第四步,本地調通Docker打包與容器運行
于是嘗試利用docker打包成鏡像,由于該項目依賴flask庫,所以在根目錄添加了requirements.txt文件,里面標明了依賴庫以及相應的版本
Flask==2.0.2
然后編寫好了Dockerfile
FROM python:3
COPY . /app/
RUN pip install -r /app/requirements.txt
WORKDIR /app
EXPOSE 5000
CMD?["python", "app.py"]
運行命令開始打包:
docker build -t flask-gitlab-ci-build-docker:latest .
打包成功,運行容器:
docker run -d -p 80:5000 flask-gitlab-ci-build-docker:latest
在瀏覽器瀏覽localhost沒有響應

查看日志發(fā)現(xiàn)沒有報錯

再嘗試用瀏覽器打開127.0.0.1,也不行

網(wǎng)上搜索發(fā)現(xiàn)python flask在服務器不能直接運行,需要借助gunicorn
于是編寫了配置文件gunicorn.conf.py:
workers = 5 # 定義同時開啟的處理請求的進程數(shù)量,根據(jù)網(wǎng)站流量適當調整
worker_class = "gevent" # 采用gevent庫,支持異步處理請求,提高吞吐量
bind = "0.0.0.0:5000" # 監(jiān)聽IP放寬,以便于Docker之間、Docker和宿主機之間的通信
同時修改了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"]
以及修改了依賴包requirements.txt:
blinker==1.4
Flask==2.0.2
gevent==21.12.0
gunicorn==20.1.0
再打包鏡像、運行容器,發(fā)現(xiàn)可以正常運作了:


第五步,Gitlab CI設置腳本自動打包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鏡像倉庫和賬號是隱私信息,因此使用Gitlab CI變量代替,再在項目CI/CD設置內賦值