使用Docker部署Python项目
日常开发Python,环境是一个让人头疼的问题,首先Python2
和Python3
很多语法不兼容,开发环境难免安装多个版本的Python,即使使用同一个版本Python不同项目使用不同版本的第三方包也会导致各种问题,所以开发Python都会使用虚拟环境,不同项目使用不同的环境,其实我们也可以使用Docker将不同的环境进行区分。
.
├── app.py
├── Dockerfile
|── .gitignore
└── requirements.txt
这是一个简单的python项目目录,只有一个app.py
,运行一个基于Flask编写的web服务,requirements.txt是运行该项目所需要的依赖。启动项目前我们先通过pip install -r requirements.txt
安装必要依赖,python3 app.py
启动项目。
app.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
if __name__ == "__main__":
app.run(debug=True,host='0.0.0.0',port=80)
现在我们创建一个容器,在容器内完成以上步骤。
FROM python:3.6
# 设置工作目录
WORKDIR /app
# 将当前目录的所有文件复制到工作目录内
ADD . /app
# 安装依赖
RUN pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/
# 启动
CMD ["python", "app.py"]
构建镜像
docker build -t py-test .
运行
docker run -p 9089:80 --name=py-test py-test
* Serving Flask app "app" (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: on
* Running on http://0.0.0.0:80/ (Press CTRL+C to quit)
好了,容器启动成功,但是这种部署方式有一个不灵活的点就是我们的代码是在容器构建的时候COPY到容器内部的,导致我们更新代码时需要重新构建容器。其实我们还可以通过volume
将我们的代码挂载在容器内部,容器执行的其实是宿主机上的代码。
FROM python:3.6
# 设置工作目录
WORKDIR /app
# 将requirements.txt复制到工作目录,方便操作
ADD ./requirements.txt /app/requirements.txt
# 安装依赖
RUN pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/
# 启动
CMD ["python", "app.py"]
启动容器时指定挂载路径,将我们当前目录挂载到/app
docker run -p 9089:80 -v $PWD/:/app -d --name=py-test py-test;
我是以DEBUG方式启动的web服务,如代码有变更,服务会自动加载,我们现在更改一下app.py的代码保存一下,可以看到服务器自动重启了
* Detected change in '/app/app.py', reloading
* Restarting with stat
* Debugger is active!
* Debugger PIN: 286-043-277
使用Docker部署Python项目
https://blog.yjll.blog/post/ee11952c.html