在python项目的docker镜像里如何使用pdm管理依赖

 更新时间:2024年08月12日 09:00:02   作者:程序设计实验室  
在 DjangoStarter 项目中,我已经使用 pdm 作为默认的包管理器,不再直接使用 pip,所以部署的时候 dockerfile 和 docker-compose 配置需要修改一下,这篇文章主要介绍了在python项目的docker镜像里使用pdm管理依赖,需要的朋友可以参考下

前言

在 DjangoStarter 项目中,我已经使用 pdm 作为默认的包管理器,不再直接使用 pip

所以部署的时候 dockerfile 和 docker-compose 配置也得修改一下。

dockerfile

首先修改一下 dockerfile

ARG PYTHON_BASE=3.11
FROM python:$PYTHON_BASE
# 设置 python 环境变量
ENV PYTHONUNBUFFERED=1
# 禁用更新检查
ENV PDM_CHECK_UPDATE=false
# 设置国内源
RUN pip config set global.index-url https://mirrors.cloud.tencent.com/pypi/simple/ && \
    # 安装 pdm
    pip install -U pdm && \
    # 配置镜像
    pdm config pypi.url "https://mirrors.cloud.tencent.com/pypi/simple/"
# 复制文件
COPY pyproject.toml pdm.lock README.md /project/
COPY . /project/
# 安装依赖项和项目到本地包目录
WORKDIR /project
RUN pdm install --check --prod --no-editable && \
    pip install uwsgi
ENV PATH="/project/.venv/bin:$PATH"

这里有几点需要注意的:

  • 如果要使用 uwsgi 则必须使用不带 slim 的Python镜像,因为 uwsgi 的编译依赖gcc,slim镜像没有
  • pdm默认会创建虚拟环境,既然是在 docker 镜像里,也可以不需要虚拟环境,这时候可以使用 pdm config python.use_venv false 配置禁用虚拟环境
  • 最后一行的环境变量配置很重要,必须把 pdm 创建的虚拟环境加入PATH,后面在 compose 里执行才能使用正确的环境

docker-compose 配置

老规矩,先上配置,然后注意事项在后面。

services:
  redis:
    image: redis
    restart: unless-stopped
    container_name: $APP_NAME-redis
    expose:
      - 6379
    networks:
      - default
  web:
    container_name: $APP_NAME
    restart: always
    build: .
    environment:
      - ENVIRONMENT=docker
      - URL_PREFIX=
      - DEBUG=true
    command: pdm run ./src/manage.py runserver 0.0.0.0:8000
    # command: uwsgi uwsgi.ini
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - redis
    networks:
      - default
      - swag
networks:
  default:
    name: $APP_NAME
  swag:
    external: true

注意:

  • 新版的 compose 已经不要求配置文件版本号了,所以第一行的 version 可以去掉。
  • 所有的容器都加上了 container_name 配置,其中的容器名称放在环境变量里配置,我的方案是在根目录里创建 .env 文件来存放环境变量。也可以在命令行里指定。
  • 网络名称也是按照环境变量的 APP_NAME 来,这点同上。
  • 这里的入口命令改成了 pdm run ./src/manage.py runserver 0.0.0.0:8000 ,使用 pdm run 可以自动启用虚拟环境。
  • uwsgi 版本可以使用,不过这个 compose 里的配置不带 NGINX 容器,后面整个项目启动之后,swag也是个容器,那边对项目里的静态文件不好处理。所以还是得在 compose 里带上个 NGINX 或者是 candy 之类的轻量级 web 服务器(其实NGINX就很轻了)

小结

就这样了,就是几个细节的地方

说起来 pdm 使用比 poetry 顺畅很多,在 docker 里使用也没有遇到什么奇奇怪怪的问题,好评👍

参考资料

到此这篇关于在python项目的docker镜像里使用pdm管理依赖的文章就介绍到这了,更多相关python pdm管理依赖内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python实现将列表中各个值快速赋值给多个变量

    python实现将列表中各个值快速赋值给多个变量

    这篇文章主要介绍了python实现将列表中各个值快速赋值给多个变量,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • Python中的正则表达式与JSON数据交换格式

    Python中的正则表达式与JSON数据交换格式

    正则表达式 是一个特殊的字符序列,一个字符串是否与我们所设定的这样的字符序列,相匹配快速检索文本、实现替换文本的操作。这篇文章主要介绍了Python中的正则表达式与JSON ,需要的朋友可以参考下
    2019-07-07
  • requests和lxml实现爬虫的方法

    requests和lxml实现爬虫的方法

    下面小编就为大家带来一篇requests和lxml实现爬虫的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • python 拷贝特定后缀名文件,并保留原始目录结构的实例

    python 拷贝特定后缀名文件,并保留原始目录结构的实例

    下面小编就为大家分享一篇python 拷贝特定后缀名文件,并保留原始目录结构的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04
  • 使用python实现PDF本地化压缩

    使用python实现PDF本地化压缩

    这篇文章主要为大家详细介绍了如何使用python实现PDF本地化压缩功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-08-08
  • 一篇文章弄懂Python中的内建函数

    一篇文章弄懂Python中的内建函数

    Python学习,内建函数是你必须要掌握的一部分,下面这篇文章主要给大家介绍了关于Python中内建函数的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2021-08-08
  • Python图像滤波处理操作示例【基于ImageFilter类】

    Python图像滤波处理操作示例【基于ImageFilter类】

    这篇文章主要介绍了Python图像滤波处理操作,结合实例形式分析了Python基于ImageFilter类实现的滤波处理相关操作技巧,需要的朋友可以参考下
    2019-01-01
  • 10个顶级Python实用库推荐

    10个顶级Python实用库推荐

    这篇文章主要推荐了10个顶级Python实用库,帮助大家更好的理解和学习实用python,感兴趣的朋友可以了解下
    2021-03-03
  • pytorch中的nn.ZeroPad2d()零填充函数实例详解

    pytorch中的nn.ZeroPad2d()零填充函数实例详解

    这篇文章主要介绍了pytorch中的nn.ZeroPad2d()零填充函数实例详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • 详解python实现读取邮件数据并下载附件的实例

    详解python实现读取邮件数据并下载附件的实例

    这篇文章主要介绍了详解python读取邮件数据并下载附件的实例的相关资料,这里提供实现实例,帮助大家学习理解这部分内容,需要的朋友可以参考下
    2017-08-08

最新评论