将flask项目打包成镜像
1. 准备flask文件
创建 app.py 文件,内容如下并开启外网访问,端口为8000from 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=8000, debug=True)
2. 本地启动flask项目
python3 app.py 启动
报错相关依赖未安装
pip3 install flask
再次启动项目
访问结果
3. 编写Dockerfile自动化上述步骤
# flask项目运行环境 FROM python:3.6.8 # 作者 LABEL maintainer="gwl" # 安装flask依赖 RUN pip install flask # 进入到指定运行目录,如果没有app文件夹,则创建文件夹 WORKDIR /app # 将源码复制到指定文件夹 COPY app.py /app # app对外开放端口 EXPOSE 8000 # 启动容器运行指令 CMD ["python3", "app.py"]
开始打包 docker build -t gwl/python3-flask .
4. 运行镜像
docker run gwl/python3-flask
看日志输出的内容已经成功启动容器。但此时如下图所示:
容器的端口未暴露给主机,也就是说主机无法访问此app,如果想访问flask项目,需要容器和主机进行一个端口映射,然后再由主机将端口暴露出去就可以访问了。
指令 docker run -p [宿主机端口]:[容器端口] image_name
示例: docker run -p 7000:8000 gwl/python3-flask ,此时将容器的8000端口映射到宿主机的7000端口,访问的时候 http://宿主机ip:7000 即可
5. 其他一些问题
当 WORKDIR 创建文件夹 指令在 COPY 后面时,此时copy是将app.py文件复制到镜像中重命名为app文件,导致后续的指令无法执行。# flask项目运行环境 FROM python:3.6.8 # 作者 LABEL maintainer="gwl" # 安装flask依赖 RUN pip install flask # 将源码复制到指定文件夹 COPY app.py /app # 进入到指定运行目录,如果没有app文件夹,则创建文件夹 WORKDIR /app # app对外开放端口 EXPOSE 8000 # 项目运行指令 CMD ["python3", "app.py"]
此时可以进入第四步容器进行查看,红色框对应镜像打包的第四步id
此时可以看到app内容就是app.py的内容
解决方案,将 COPY app.py /app 改为 COPY app.py /app/。
或者将 WORKDIR /app 放到COPY前面