404*_*und 1 django docker dockerfile virtual-environment python-poetry
我有一个 Django REST 框架 API,我试图在 Docker 中运行它。该项目使用 Poetry 1.1.12。运行时,我可以看到 Poetry 已正确安装,并且 Poetry 安装了 my 中的包pyproject.toml,包括 Django。我正在使用 Supervisor 来使用 Daphne 运行 API,以及执行一些其他任务(例如收集静态文件)。
但是,当主管运行该应用程序时,我得到:
Traceback (most recent call last):
File "/home/docker/api/manage.py", line 22, in <module>
main()
File "/home/docker/api/manage.py", line 13, in main
raise ImportError(
ImportError: Couldn't import Django. Are you sure it's installed and available on your PYTHONPATH environment variable? Did you forget to activate a virtual environment?
Traceback (most recent call last):
File "/home/docker/api/manage.py", line 11, in main
from django.core.management import execute_from_command_line
ModuleNotFoundError: No module named 'django'
Run Code Online (Sandbox Code Playgroud)
请注意我如何设置POETRY_VIRTUALENVS_CREATE=false和ENV PATH="/root/.local/bin:${PATH}"。根据诗歌安装脚本,那就是需要添加到PATH中的路径。
这是我的 Dockerfile 的删节版本:
FROM python:3.9-slim-buster
ENV PATH="/root/.local/bin:${PATH}"
RUN apt-get update && apt-get install -y --no-install-recommends \
... \
curl \
supervisor \
&& curl -sSL 'https://install.python-poetry.org' | python - && poetry --version \
&& apt-get remove -y curl \
&& apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false \
&& apt-get clean -y && rm -rf /var/lib/apt/lists/* \
&& rm -rf /var/lib/apt/lists/*
COPY poetry.lock pyproject.toml /home/docker/api/
WORKDIR /home/docker/api
RUN if [ "$DEBUG" = "false" ] \
; then POETRY_VIRTUALENVS_CREATE=false poetry install --no-dev --no-interaction --no-ansi -vvv --extras "production" \
; else POETRY_VIRTUALENVS_CREATE=false poetry install --no-interaction --no-ansi -vvv --extras "production" \
; fi
COPY . /home/docker/api/
COPY .docker/services/api/files/supervisor.conf /etc/supervisor/conf.d/
CMD ["supervisord", "-n"]
Run Code Online (Sandbox Code Playgroud)
我看到其他人就是这样做的。有任何想法吗?
Poetry将自己描述为非常非常努力地始终在虚拟环境中运行。然而,Docker 容器本身与其他 Python 是隔离的,在“系统”Python 中安装包是正常的(也是最简单的)。
有一个poetry export命令可以将 Poetry 的文件转换为普通的 piprequirements.txt文件,然后您可以RUN pip install在 Dockerfile 中进行操作。您可以使用多阶段 Dockerfile 来生成该文件,而无需在主映像中实际包含 Poetry。
FROM python:3.9-slim-buster AS poetry
RUN pip install poetry
WORKDIR /app
COPY pyproject.toml poetry.lock .
RUN poetry export -f requirements.txt --output requirements.txt
FROM python:3.9-slim-buster
WORKDIR /app
COPY --from=poetry /app/requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["./manage.py", "runserver", "0.0.0.0:8000"]
Run Code Online (Sandbox Code Playgroud)
django应该显示在生成的requirements.txt文件中,并且由于pip install将其安装为“正常”“系统”Python 包,因此您的应用程序应该能够正常看到它,而无需调整环境变量或其他设置。
| 归档时间: |
|
| 查看次数: |
5109 次 |
| 最近记录: |