一、准备工作
# vi m.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
if __name__ == "__main__":
app.run(host='0.0.0.0', port=8080)
# vi requirements.txt
flask
# vi Dockerfile
FROM python:3.8-slim
WORKDIR /test
# 将工作目录切换为 /test
# 意思是在这一句之后,Dockerfile 后面的操作都以这一句指定的 /test 目录作为当前目录。
COPY . /test
# 将当前目录下的所有内容复制到 /test 下
# Dockerfile 里的原语并不都是指对容器内部的操作。比如 ADD,指的是把当前目录(即 Dockerfile 所在的目录)里的文件,复制到指定容器内的目录当中。
RUN pip install --trusted-host pypi.python.org -r requirements.txt
# 允许外界访问容器的 80 端口
EXPOSE 8080
CMD ["python3", "m.py"]
# 设置容器进程为:python app.py,即:这个 Python 应用的启动命令
# 这里app.py 的实际路径是 /app/app.py。CMD ["python", "app.py"] 等价于 "docker run python app.py"。
# 在使用 Dockerfile 时,可能还会看到一个叫作 ENTRYPOINT 的原语。它和 CMD 都是 Docker 容器进程启动所必需的参数,完整执行格式是:"ENTRYPOINT CMD"。
# 但是,默认,Docker 会提供一个隐含的 ENTRYPOINT,即:/bin/sh -c。所以,在不指定 ENTRYPOINT 时,比如在这个例子里,实际上运行在容器里的完整进程是:/bin/sh -c "python app.py",即 CMD 的内容就是 ENTRYPOINT 的参数。
# 基于以上原因,后面会统一称 Docker 容器的启动进程为 ENTRYPOINT,而不是 CMD。
二、开始执行
# ‘.’ 代表当前路径
# 创建镜像
docker build --tag=flasker .
/test 是容器内部的挂载点,它将映射到主机的 /home/test 目录,要运行这个容器并设置挂载点,可以使用以下命令:
# 创建容器
docker run -d -p 8080:8080 -v /home/test:/test flasker
三、修改文件
# 修改本地文件之后
docker stop 容器
docker start 容器