首页 > 极客资料 博客日记
在python项目的docker镜像里使用pdm管理依赖
2024-08-11 23:00:06极客资料围观27次
本篇文章分享在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 里使用也没有遇到什么奇奇怪怪的问题,好评👍
参考资料
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签:
相关文章
最新发布
- Nuxt.js 应用中的 prerender:routes 事件钩子详解
- 【问题解决】Tomcat由低于8版本升级到高版本使用Tomcat自带连接池报错无法找到表空间的问题
- 【FAQ】HarmonyOS SDK 闭源开放能力 —Vision Kit
- 六、Spring Boot集成Spring Security之前后分离认证流程最佳方案
- 《JVM第7课》堆区
- .NET 8 高性能跨平台图像处理库 ImageSharp
- 还在为慢速数据传输苦恼?Linux 零拷贝技术来帮你!
- 刚毕业,去做边缘业务,还有救吗?
- 如何避免 HttpClient 丢失请求头:通过 HttpRequestMessage 解决并优化
- 让性能提升56%的Vue3.5响应式重构之“版本计数”