教你如何通过编写dockerfile部署python项目
作者:现实、狠残酷
Dockerfile是一个放置在项目根目录下的描述文件,可以利用 Docker 命令基于该文件构建一个镜像,下面这篇文章主要给大家介绍了关于如何通过编写dockerfile部署python项目的相关资料,需要的朋友可以参考下
docker命令总览
docker通过dockerfile构建镜像常用命令
# 创建镜像(进入dockerfile所在的路径) docker build -t my_image:1.0 . # 查看镜像 docker images # 创建容器 docker run -dit --restart=always -p 9700:9700 --name my_container my_image:1.0 # 查看容器 docker ps -a # 进入容器 docker exec -it my_container /bin/bash # 退出容器 exit # 暂停容器 docker stop my_container # 删除容器 docker rm my_container
dockerfile编写
# 使用官方的Python运行时作为父镜像 FROM python:3.10 # 设置工作目录为/app WORKDIR /app # 将当前目录内容复制到位于 /app 的容器中 COPY . /app # 安装任何需要的包 RUN pip install torch-2.0.0+cpu-cp310-cp310-linux_x86_64.whl RUN pip install torchvision-0.15.1+cpu-cp310-cp310-linux_x86_64.whl RUN pip install --no-cache-dir -r requirements_new.txt -i https://pypi.tuna.tsinghua.edu.cn/simple # RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple # 将/etc/localtime链接到上海时区文件 RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime # 对外暴露的端口号 EXPOSE 9700 # 定义环境变量 ENV model = gpt-4-vision-preview # 当容器启动时运行python app.py CMD ["python", "app.py"]
dockerfile中COPY与ADD的区别
在 Dockerfile 中,COPY 和 ADD 指令都用于将文件或目录从构建上下文复制到镜像中,但它们之间有一些重要的区别:
1.基本功能:
- COPY:将本地文件或目录复制到镜像中。
- ADD:将本地文件、目录或远程文件 URL 的内容复制到镜像中。如果源文件是一个 URL,并且目标文件不存在,则 ADD 指令还会下载和解压 URL 指向的文件(如果它是压缩的)。
2.对压缩文件的处理:
- COPY:不会处理压缩文件,如果源文件是一个 .tar、.gz 或其他压缩格式的文件,它将被复制到镜像中,但不会解压。
- ADD:如果源文件是一个压缩文件(如 .tar、.tar.gz、.tgz、.bz2、.xz 等),则 ADD 指令会自动解压该文件到目标目录(如果指定了的话)。
3.构建缓存:
- COPY 和 ADD 都会受益于 Docker 的构建缓存。但是,由于 ADD 会处理 URL 和解压文件,因此它可能更难以有效地使用缓存。如果远程文件的内容更改,或者压缩文件的内容更改,即使解压后的内容没有更改,ADD 也可能导致缓存失效。
4.最佳实践:
通常,推荐使用 COPY 指令,因为它更直观、更简单,并且更容易理解。当需要复制本地文件或目录到镜像时,COPY 是首选。
如果需要从远程 URL 下载文件,或者需要解压压缩文件到镜像中,可以使用 ADD 指令。但是,请注意 ADD 的一些潜在问题,如缓存失效和不必要的复杂性。
5.安全性:
- 使用 ADD 从远程 URL 下载文件可能会引入安全风险,因为远程文件的内容可能不受控制。如果可能,最好从受信任的源下载文件,并使用 COPY 指令将文件复制到镜像中。
6.目标路径:
- 对于 COPY 和 ADD,如果目标路径不存在,Docker 将尝试创建它。但是,如果目标路径是一个文件而不是目录,并且该文件已经存在,则操作将失败。
总结:在 Dockerfile 中,应优先考虑使用 COPY 指令来复制本地文件或目录到镜像中。只有在需要特定功能(如从远程 URL 下载文件或解压压缩文件)时,才使用 ADD 指令。
将容器转化为镜像和镜像压缩解压
# 将容器转化为镜像 docker commit my_container my_image:1.2 # 将镜像转为压缩包 docker save -o my_package.tar my_image:1.2 # 删除原镜像 docker rmi my_image:1.2 # 将压缩包解压得到镜像 docker load –i my_package.tar
将镜像推送到私有仓库
# 标记镜像 docker tag logistics_park:base 10.82.27.215:10081/ai_platform/logistics_park:base # 将镜像推送到私有仓库 docker push 10.82.27.215:10081/ai_platform/logistics_park:base
根据基础镜像创建docker容器
docker pull python:3.10 # 创建容器不进入 docker run -dit --name=p1 python:3.10 # 进入容器 docker exec -it p1 bash # 创建文件夹 mkdir app # 推出容器 exit # 将需要的依赖拷贝到镜像指定目录 docker cp torchvision-0.15.1+cpu-cp310-cp310-linux_x86_64.whl p1:app/ # 升级pip pip3 install --upgrade pip # 安装需要的依赖(加上镜像源) pip install -r requirements_new.txt -i https://pypi.tuna.tsinghua.edu.cn/simple # 退出容器 exit # 将容器打包为镜像(确保容器正在运行) docker commit p1 logistics_park:base # 标记镜像 docker tag logistics_park:base 10.82.27.215:10081/ai_platform/logistics_park:base # 将镜像推送到私有仓库 docker push 10.82.27.215:10081/ai_platform/logistics_park:base # 构建镜像 docker build -t logistics_park:v1.0 . # 容器运行命令: docker run -dit --restart=always -p 9700:9700 --name logistics_park logistics_park:v1.0
通过基础镜像创建容器的dockefile
# 使用官方的Python运行时作为父镜像 FROM 10.82.27.215:10081/ai_platform/logistics_park:base # 设置工作目录为/app WORKDIR /app # 将当前目录内容复制到位于 /app 的容器中 COPY . /app # 将/etc/localtime链接到上海时区文件 RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime # 验证时区 RUN date # 对外暴露的端口号 EXPOSE 9700 # 定义环境变量 # ENV model = gpt-4-vision-preview # 当容器启动时运行python app.py CMD ["python", "app.py"]
总结
到此这篇关于如何通过编写dockerfile部署python项目的文章就介绍到这了,更多相关dockerfile部署python项目内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!