写点什么

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

作者:EquatorCoco
  • 2024-09-05
    福建
  • 本文字数:1317 字

    阅读完需:约 4 分钟

前言


在 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 /projectRUN 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 里使用也没有遇到什么奇奇怪怪的问题,好评👍


文章转载自:DealiAxy

原文链接:https://www.cnblogs.com/deali/p/18354017

体验地址:http://www.jnpfsoft.com/?from=infoq

用户头像

EquatorCoco

关注

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
在python项目的docker镜像里使用pdm管理依赖_Python_EquatorCoco_InfoQ写作社区