前言

在 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管理依赖的更多相关文章

  1. spring-boot项目的docker集成化部署(一)

    目录 spring-boot项目的docker集成化部署 前言 基本思路与方案 基本步骤 准备源码 服务器和基础环境 结语 1. 本文总结: 2. 后期优化: spring-boot项目的docker ...

  2. 微服务项目的docker自动化部署流程

    目录 微服务的Docker自动化部署 制作JDK1.8的Docker镜像 Docker常用命令介绍 制作image的一般流程 将本地的image上传至私人仓库 使用Maven插件实现自动化docker ...

  3. Python环境搭建、python项目以docker镜像方式部署到Linux

    Python环境搭建.python项目以docker镜像方式部署到Linux 本文的项目是用Python写的,记录了生成docker镜像,然后整个项目在Linux跑起来的过程: 原文链接:https: ...

  4. 创建Python数据分析的Docker镜像+Docker自定义镜像commit,Dockerfile方式解析+pull,push,rmi操作

    实例解析Docker如何通过commit,Dockerfile两种方式自定义Dcoker镜像,对自定义镜像的pull,push,rmi等常用操作,通过实例创建一个Python数据分析开发环境的Dock ...

  5. 利用Docker volume修改Nginx Docker镜像里index.html

    通过这个小例子我们可以进一步加深对Docker volume概念的理解和使用方法. 我们都知道运行基于Docker的Nginx镜像后,访问localhost能看到Nginx默认的首页,这个首页的位置是 ...

  6. Docker镜像的仓库及底层依赖的核心技术(3)

    一.docker镜像的仓库 仓库分为公共仓库和私有仓库 DockerHub的官方仓库:https://hub.docker.com DockerPool社区仓库:https://dl.dockerpo ...

  7. 4. docker镜像的概念、管理(查看、下载、删除)

    镜像的概念 镜像是一个包含程序运行必要依赖环境和代码的只读文件,它采用分层的文件系统,将每一次改变以读写层的形式增加到原来的只读文件上.镜像是容器运行的基石. 下图展示的是Docker镜像的系统结构. ...

  8. 最近的两个小项目,2:Python webapp的docker镜像

    时间过得真快,一眨眼一个多月没更新了,但这一个月我可没偷懒啊,真的是忙.粘上两篇ReadMe勉强凑合一下,保持博客更新是好习惯. 基于Flask框架,uwsgi起服务,supervisor做管理,应该 ...

  9. docker笔记(3) ------Django项目的docker部署

    2019-01-12   14:23:18 django容器连接到mysql_server容器分析:原myblog项目使用sqlit3数据库,使用mysql容器前需要在django中加入pymysql ...

  10. 基于Python项目的Redis缓存消耗内存数据简单分析(附详细操作步骤)

    目录 1 准备工作 2 具体实施   1 准备工作 什么是Redis? Redis:一个高性能的key-value数据库.支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使 ...

随机推荐

  1. windows rabbitmq安装

    windows rabbitmq安装1.环境变量,关键是rabbitmq_server需要与erlang版本对应,否则无法使用. rabbitmq下载页https://github.com/rabbi ...

  2. onreadystatechange 属性

    onreadystatechange 属性是 XMLHttpRequest 对象的一个事件处理器,用于在 XMLHttpRequest 对象的 readyState 属性发生变化时触发.这个属性通常用 ...

  3. Oh-My-Zsh 提示符只显示当前路径,不需要修改主题文件

    我真是服了.就这么一个简单的小问题我在网上找了一个多小时,一大堆 CSDN 文章都是抄 同一篇博客 的教程,所有的博客都要我去把 ~/.oh-my-zsh/themes/*.zsh-theme 文件里 ...

  4. JAVA-poi导出excel到http响应流

    导出结果为excel是相对常见的业务需求,大部分情况下只需要导出简单的格式即可,所以有许多可以采用的方案.有些方案还是很容易实现的. 一.可用的解决方案 目前可以有几类解决方案: 字处理企业提供的解决 ...

  5. 为什么不推荐使用Linq?

    相信很多.NETer看了标题,都会忍不住好奇,点进来看看,并且顺便准备要喷作者! 这里,首先要申明一下,作者本人也非常喜欢Linq,也在各个项目中常用Linq. 我爱Linq,Linq优雅万岁!!!( ...

  6. Fake权限验证小例子

    前言 关于本地测试如何进行Fake权限验证 正文 在我们使用swagger调试本地接口的时候,我们常常因为每次需要填写token而耽误工作,不可能每次调试的时候都去本地测试环境请求一个token进行验 ...

  7. 解决方案 | 外接键盘win+d失效,绿联键盘win+d,win+e失效

    按下fn + 右边的win键 即可解决.如下图所示.

  8. tp5 为什么使用单例模式

    首先我们要知道明确单例模式这个概念,那么什么是单例模式呢?单例模式顾名思义,就是只有一个实例.作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例, 这个类我们 ...

  9. Django4全栈进阶之路24 项目实战(报修类型表):CKEditor富文本

    CKEditor是一个强大的富文本编辑器,可以用于在网站或应用程序中创建和编辑内容.以下是在安装和使用CKEditor的一般步骤: 安装CKEditor: 下载CKEditor:访问CKEditor官 ...

  10. 靶机练习: hacksudo---Thor

    靶机:hacksudo---Thor 准备工作 靶机地址: http://download.vulnhub.com/hacksudo/hacksudo---Thor.zip MD5 校验:d12168 ...