前言
在 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管理依赖内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论