在python專案的docker映象裡使用pdm管理依賴

程序设计实验室發表於2024-08-11

前言

在 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 裡使用也沒有遇到什麼奇奇怪怪的問題,好評👍

參考資料

  • https://pdm-project.org/zh-cn/latest/usage/advanced/#dockerfile-pdm

相關文章