pdm-project / pdm

A modern Python package and dependency manager supporting the latest PEP standards
https://pdm-project.org
MIT License
7.02k stars 352 forks source link

使用 Dockerfile 构建项目出现权限问题 #2859

Closed 522247020 closed 1 month ago

522247020 commented 1 month ago

问题1

我创建了一个 Django 项目,使用 pdm 来管理。 我使用 Dockerfile 构建项目时,根据文档来构建多层镜像,启动项目的时候出现了一个错误

File "/code/.venv/lib/python3.12/site-packages/django/db/backends/sqlite3/base.py", line 180, in get_new_connection
    conn = Database.connect(**conn_params)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
django.db.utils.OperationalError: unable to open database file

经过排查是在构建项目的时候使用多层镜像,在复制项目文件的时候目录权限出现了问题,这个问题不应该的 pdm 的问题。 希望在文档中添加 对于复制后的文件夹添加权限。 如:

...
# run stage
FROM python:$PYTHON_BASE

# retrieve packages from build stage
COPY --from=builder /project/.venv/ /project/.venv
# 修改文件夹权限
RUN chown 1000:1000 /project
ENV PATH="/project/.venv/bin:$PATH"

问题2

我是在 Windows 上面 使用 pycharm 来开发 Django,因此我在开发的时候不需要 uwsgi ,但是我在生产环境又是需要的。 我在 pyproject.toml 内的 dependencies 手动添加了 uwsgi~=2.0.24, 但是 pdm.lock 文件并不会出现 文档中给出的示例

# install dependencies and project into the local packages directory
WORKDIR /project
RUN pdm install --check --prod --no-editable

文档中的 --check 会导致错误,我去除了这个选项,错误就不会再出现了。

对于这种 开发环境不需要,生产环境需要的库有什么解决方法吗?

huxuan commented 1 month ago

Maybe we can use optional dependencies for those only necessary for deployment?

522247020 commented 1 month ago

我尝试下使用可选扩展, 手动在 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"]
frostming commented 1 month ago

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.

522247020 commented 1 month ago

删除 pdm lock 文件,然后执行 pdm lock -G deploy。 在安装过程没有出现错误,最后出现

/code/docker-entrypoint.sh: 19: exec: uwsgi: not found

应该在生产环境中没有安装这个可选的依赖?

frostming commented 1 month ago
pdm install --check --prod --no-editable

Change to

pdm install --check --prod -G deploy --no-editable
522247020 commented 1 month ago

pdm install --check --prod -G deploy --no-editable

解决。🙏。