在python项目的docker镜像里如何使用pdm管理依赖
目录
- 前言
- dockerfile
- docker-compose 配置
- 小结
- 参考资料
前言
在 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/www.devze.com" # 复制文件 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:http://www.devze.com8000" depends_on: - redis networks: - default android - 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 里使用也没有遇到什么奇奇怪怪的问题,好评
参考资料
- https://pdm-project.org/zh-cn/latest/usage/advanced/#dockerfile-pdm
到此这篇关于在python项目的docker镜像里使用pdm管理依赖的文章就介绍到这了,更多相关python pdm管理依赖内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多android多支持编程客栈(www.devze.com)!
精彩评论