需要解决的主要问题:如何在宿主机修改代码,在容器中实时刷新代码效果。
解决方案就是VOLUME,挂载。具体操作方式也有多种,本文通过编写compose文件的方式来实现挂载。
本文假设读者已经了解Docker的基础知识:镜像、容器的概念,Docker的基本操作。
笔者使用docker的思想是:镜像作为材料,Compose作为蓝图,通过修改蓝图来生成分别适用于开发、测试、生产环境的容器。
镜像是一个相对比较固定的部分。
具体实践是:Dockerfile来生成镜像,镜像包含运行时的必要条件(库依赖、源码之类)。Compose来决定运行时的环境(容器连接、挂载、环境变量等)。
以flask项目为例。
新建一个目录叫 flask-demo, 这个目录将存放我们的项目源码和Dockerfile文件。
$ mkdir flask-demo
$ cd flask-demo
新建一个flask项目
在flask-demo里创建一个目录叫hello,并创建flask项目放于该目录。
现在的目录结构是这样的
flask-demo
- hello # 这里就是flask项目
- app.py
- .....
app.py文件如下:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run()
通过Dockerfile创建新镜像
创建一个镜像,该镜像包含web源码和web的依赖。
在flask-demo目录里,创建Dockerfile文件
Dockerfile
FROM python
RUN apt-get update
RUN pip install flask
WORKDIR /app
COPY ./hello /app/hello
ENTRYPOINT FLASK_APP=/app/hello/app.py flask run -h 0.0.0.0 -p 80
EXPOSE 80
生成镜像
# build一个名为flask-demo的镜像
$ docker build -t flask-demo ./
# 运行flask-demo镜像. 将宿主机的5000端口映射到容器的80端口
$ docker run -p 5000:80 flask-demo
现在,浏览器输入 http://localhost:5000 就可以看到正常运行的网页了。
那么,证明我们的镜像是OK的了。
但是,现在宿主机修改代码,容器是不会刷新的,因为容器里面的代码只是一份拷贝。
现在,我们来编写compose文件
还是在flask-demo目录里,新建文件docker-compose.yml
docker-compose.yml
version: "3"
services:
flask-demo:
build: ./
ports:
- "5000:80"
volumes:
- ./hello:/app/hello #将容器里面的/app/hello挂载到宿主机的./hello目录
environment:
- FLASK_ENV=development # 指定开发环境,修改代码会实时刷新项目
(如果Dockerfile和docker-compose.yml有相同的字段配置,那么会优先采用docker-compose.yml的配置。)
现在来测试一下我们的compose文件。
【记得把刚才运行的容器停止了】
执行以下命令来运行容器
$ docker-compose up
现在,浏览器输入 http://localhost:5000 就看到正常运行的网页了。
然后修改flask项目的app.py并保存,刷新浏览器,你会发现内容实时刷新了。
原文地址:https://www.cnblogs.com/ZJT7098/p/12357417.html