前言
在 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