教你如何通过编写dockerfile部署python项目

 更新时间:2024年07月26日 09:45:02   作者:现实、狠残酷  
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项目内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • docker容器与宿主机的数据交互方式总结

    docker容器与宿主机的数据交互方式总结

    这篇文章主要给大家介绍了关于docker容器与宿主机的数据交互,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • docker compose idea CreateProcess error=2 系统找不到指定的文件的问题

    docker compose idea CreateProcess error=2 系统找不到指定的文件的问题

    这篇文章主要介绍了docker compose idea CreateProcess error=2 系统找不到指定的文件的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • docker 查看容器日志命令的实现

    docker 查看容器日志命令的实现

    这篇文章主要介绍了docker 查看容器日志命令的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Mobaxterm解锁Docker的技巧

    Mobaxterm解锁Docker的技巧

    Mobaxterm是一款功能强大的工具,可以帮助开发者更高效地使用Docker,通过结合Docker和Mobaxterm,你可以轻松地管理Docker容器、运行Docker应用,并实现远程访问,本文给大家介绍Mobaxterm解锁Docker的详细过程,感兴趣的朋友一起看看吧
    2025-05-05
  • Docker中的COPY指令和ADD指令详解

    Docker中的COPY指令和ADD指令详解

    COPY 和 ADD 都是 Dockerfile 中的指令,有着类似的作用。它们允许我们将文件从特定位置复制到 Docker 镜像中,这篇文章主要介绍了Docker中的COPY指令和ADD指令,需要的朋友可以参考下
    2022-06-06
  • docker 的volumes清理步骤

    docker 的volumes清理步骤

    文章介绍了如何在Docker中清理volumes以释放磁盘空间,包括查看所有卷、查找未使用的卷、清理未使用的卷、手动删除特定卷、检查卷的使用情况、清理卷中的数据、预防措施以及迁移Docker数据目录等步骤,感兴趣的朋友一起看看吧
    2025-03-03
  • 使用Docker-compose离线部署Django应用的方法

    使用Docker-compose离线部署Django应用的方法

    这篇文章主要介绍了使用Docker-compose离线部署Django应用的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-03-03
  • Docker命令行输出格式化完全指南

    Docker命令行输出格式化完全指南

    在Docker中大多数的输出命令都支持--format 选项,用于控制输出,下面这篇文章主要给大家介绍了关于Docker命令行输出格式化的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-07-07
  • docker中nginx的location转发不生效的解决

    docker中nginx的location转发不生效的解决

    这篇文章主要介绍了docker中nginx的location转发不生效的解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • docker-compose网络配置- IP 主机名 hosts配置方式

    docker-compose网络配置- IP 主机名 hosts配置方式

    这篇文章主要介绍了docker-compose网络配置- IP 主机名 hosts配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01

最新评论