Продвинутый учебник по Django: Выполнение команды в Dockerfile приводит к ошибке

Я следовал руководству Advanced django tutorial по многократно используемым приложениям, для чего создал Dockerfile:

FROM python:3.11.11-alpine3.21

# Install packages (acc. to instructions
# https://github.com/gliderlabs/docker-alpine/blob/master/docs/usage.md)
RUN apk --no-cache add curl ca-certificates sqlite git 

WORKDIR /app

COPY setup.py .
COPY pyproject.toml .

# Install `uv` acc. to the instructions 
# https://docs.astral.sh/uv/guides/integration/docker/#installing-uv
ADD https://astral.sh/uv/0.5.29/install.sh /uv-installer.sh
RUN sh /uv-installer.sh && rm /uv-installer.sh
ENV PATH="/root/.local/bin/:$PATH"

# Install packages with uv into system python
RUN uv pip install --system -e .

# Expose the Django port
EXPOSE 8000

RUN git config --global --add safe.directory /app

Теперь у меня есть следующая структура:

django-polls-v2/
    - dist/
        - .gitignore
        - django_polls_v2-0.0.1-py3-none-any.whl
        - django_polls_v2-0.0.1.tar.gz
    - django_polls_v2/
        - migrations/
            - ...
        - static/
            - ...
        - templates/
            - ...
        - __init__.py
        - admin.py
        - ... 
    - README.rst
    - pyproject.toml
    - MANIFEST.in
    - LICENSE

Для установки моего собственного пакета, см. здесь, в документации указано, что нужно выполнить следующее (где я изменил имена файлов, чтобы отразить мои настройки):

python -m pip install --user django-polls-v2/dist/django_polls_v2/0.0.1.tar.gz

Теперь, когда я выполняю эту команду внутри запущенного контейнера docker (где я попадаю в контейнер docker, выполнив команду docker run -p 8000:8000 --shm-size 512m --rm -v $(pwd):/app -it django:0.0.1 sh), пакет устанавливается.

Однако, поместив ту же команду в Dockerfile, я получаю ошибку

1.619 WARNING: Requirement 'django-polls-v2/dist/django_polls_v2-0.0.1.tar.gz' looks like a filename, but the file does not exist
1.670 Processing ./django-polls-v2/dist/django_polls_v2-0.0.1.tar.gz
1.671 ERROR: Could not install packages due to an OSError: [Errno 2] No such file or directory: '/app/django-polls-v2/dist/django_polls_v2-0.0.1.tar.gz'

Однако, поскольку путь правильный, я не могу понять, почему возникает ошибка. Я уже пытался создать не корневого пользователя перед выполнением команды, но безрезультатно. Что посоветуете?

Когда вы запускаете свой контейнер, вы сопоставляете свой текущий рабочий каталог с контейнером, используя сопоставление томов -v $(pwd):/app. Вот почему вы можете установить пакет в этом сценарии.

Когда вы пытаетесь установить его во время процесса сборки в свой Dockerfile, у вас нет такого сопоставления, и вы не КОПИРУЕТЕ файл в образ. Поэтому процесс установки не может его найти.

Простой способ вставить его в изображение - заменить

COPY setup.py .
COPY pyproject.toml .

с

COPY . .

Это скопирует всю вашу структуру каталогов в изображение, и ваш tar-файл будет доступен.

Вернуться на верх