Closed 522247020 closed 1 month ago
Maybe we can use optional dependencies for those only necessary for deployment?
我尝试下使用可选扩展,
手动在 pyproject.toml
文件中添加
[project.optional-dependencies]
deploy = [
"uwsgi~=2.0.24",
]
在构建时 pdm install
添加 --check
选项,还是会出现错误
32.27 + pdm install --check --prod --no-editable
32.89 WARNING: Lockfile hash doesn't match pyproject.toml, packages may be outdated
32.89 Please run `pdm lock` to update the lock file
使用 pdm add -G deploy uwsgi~=2.0.24
在安装的时候出现错误
查看 pdm.lock
文件
[[package]]
name = "uwsgi"
version = "2.0.25.1"
summary = ""
groups = ["deploy"]
files = [
{file = "uwsgi-2.0.25.1.tar.gz", hash = "sha256:d653d2d804c194c8cbe2585fa56efa2650313ae75c686a9d7931374d4dfbfc6e"},
]
文件中是有,看内容应该是没有安装成功导致内容不全,导致构建时检查 pdm.lock
文件
在构建时依然会出现上面的错误
pyproject.toml
文件
[project]
name = "dormitory-management"
version = "0.1.0"
description = "Default template for PDM package"
authors = [
{name = "萌海无涯", email = "522247020@qq.com"},
]
dependencies = [
"django~=4.2.11",
"xlwt>=1.3.0",
]
requires-python = "==3.12.*"
readme = "README.md"
license = {text = "MIT"}
[tool.pdm]
distribution = false
[project.optional-dependencies]
deploy = [
"uwsgi~=2.0.24",
]
[tool.pdm.dev-dependencies]
dev = [
"selenium>=4.18.1",
]
Dockerfile
文件
# 设置 Python 的镜像版本
ARG PYTHON_BASE=3.12
# 构建阶段
FROM python:$PYTHON_BASE AS builder
# 禁用更新检查
ENV PDM_CHECK_UPDATE=false
# 创建代码目录
RUN mkdir /code/
# 设置工作目录
WORKDIR /code/
# 添加代码文件到容器中
ADD . /code/
# 构建环境
RUN set -ex \
&& pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/ \
&& pip install -U pdm \
&& pdm config pypi.url https://mirrors.aliyun.com/pypi/simple/ \
&& pdm install --check --prod --no-editable
# 运行阶段
FROM python:$PYTHON_BASE
LABEL authors="mhwy"
LABEL version="1.0"
# 从构建阶段获取包
COPY --from=builder /code/ /code/
# 设置环境变量
ENV VIRTUAL_ENV=/code/.venv/ PATH=/code/.venv/bin:$PATH PYTHONPATH=/code/ PORT=8000 DJANGO_SETTINGS_MODULE=ddhl.settings DJANGO_DEBUG=on
WORKDIR /code/
# 确保静态文件可由uWSGI进程写入
RUN chown -R 1000:1000 /code
# 代码标记为本地卷
#VOLUME ["/code/media/"]
# 对外暴漏端口
EXPOSE 8000
# 启动uWSGI前,使用包装脚本可以轻松地将更多命令添加到容器启动中:
ENTRYPOINT ["sh", "/code/docker-entrypoint.sh"]
USER 1000:1000
CMD ["uwsgi", "/code/etc/uwsgi.ini"]
Add uwsgi
to pyproject.toml
manually, remove pdm.lock
and run pdm lock -G deploy
to generate the lockfile. The installation won't succeed on your dev machine since uwsgi requirements are not met, so pdm add
doesn't work.
删除 pdm lock
文件,然后执行 pdm lock -G deploy
。
在安装过程没有出现错误,最后出现
/code/docker-entrypoint.sh: 19: exec: uwsgi: not found
应该在生产环境中没有安装这个可选的依赖?
pdm install --check --prod --no-editable
Change to
pdm install --check --prod -G deploy --no-editable
pdm install --check --prod -G deploy --no-editable
解决。🙏。
问题1
我创建了一个 Django 项目,使用 pdm 来管理。 我使用 Dockerfile 构建项目时,根据文档来构建多层镜像,启动项目的时候出现了一个错误
经过排查是在构建项目的时候使用多层镜像,在复制项目文件的时候目录权限出现了问题,这个问题不应该的 pdm 的问题。 希望在文档中添加 对于复制后的文件夹添加权限。 如:
问题2
我是在 Windows 上面 使用 pycharm 来开发 Django,因此我在开发的时候不需要
uwsgi
,但是我在生产环境又是需要的。 我在pyproject.toml
内的dependencies
手动添加了uwsgi~=2.0.24
, 但是pdm.lock
文件并不会出现 文档中给出的示例文档中的
--check
会导致错误,我去除了这个选项,错误就不会再出现了。对于这种 开发环境不需要,生产环境需要的库有什么解决方法吗?