pipenv docker compose в PyCharm
6 декабря 2022 г. 4:33
На момент публикации страницы PyCharm не поддерживает pipenv с docker (тикет: https://youtrack.jetbrains.com/issue/PY-36414). В чем проблема?
Как вы знаете, Pipenv устанавливает зависимости по разным путям, таким как /home/vivazzi/.local/share/virtualenvs/vivivys-pxi3oUGW/bin/python
, где vivivys-pxi3oUG
генерируется по-разному в зависимости от разных факторов. С другой стороны, Pycharm требует указать конкретный путь к интерпретатору:
Обратите внимание, что в этом окне мы не можем видеть сгенерированный путь к интерпретатору, поэтому в следующем окне (щелчок через многоточие) мы не знаем, что мы должны ввести:
Если вы введёте путь к глобальному интерпретатору (что-то вроде: /usr/bin/python
или /usr/local/bin/python
), вы сможете создать доступ к удалённому интерпретатору, но ваше ведь ваше приложение имеет виртуальное окружение, поэтому приложение не сможет найти нужные пакеты, например:
Traceback (most recent call last): File "/home/vivazzi/projects/other/vivivys/manage.py", line 8, in <module> from django.core.management import execute_from_command_line ModuleNotFoundError: No module named 'django'
Есть несколько путей решить данную проблему. В вашем docker-compose.yml
вы можете:
- Использовать
--system
параметрpip install --system
для установки пакетов глобально. - Установить виртуальное окружение в корень проекта для получения точного неизменяемого пути к виртуальному окружению.
В этой статье я покажу второй вариант.
Создание виртуального окружения pipenv в папке приложения
Pipenv позволяет устанавливать виртуальное окружение в папку приложения, если в папке приложения есть папка .venv
. Так вы сможете узнать путь к python. Это будет похоже на /path_to_your_project/.venv/bin/python
.
Давайте посмотрим на пример! Взгляните на Dockerfile со следующим кодом:
FROM python:3.11-slim ENV PYTHONDONTWRITEBYTECODE 1 ENV PYTHONUNBUFFERED 1 RUN pip install pipenv EXPOSE 8000 WORKDIR /app COPY Pipfile.lock . RUN PIPENV_VENV_IN_PROJECT=1 pipenv sync COPY . .
PIPENV_VENV_IN_PROJECT=1
при вызове команды RUN PIPENV_VENV_IN_PROJECT=1 pipenv sync
будет указывать pipenv устанавливать виртуальное окружение в корне проекта, т. е. /app/.venv/
. Соответственно путь до интерпретатора будет:
/app/.venv/bin/python
Этого достаточно, чтобы использовать Pycharm для запуска вашего кода и дебага! Повторите шаги по скриншотам, описанные в начале статьи, и впишите этот путь до python - Pycharm должен увидеть окружение:
Хоть Pycharm и ругается, что якобы не нашёл путь, но он его найдёт, если нажать "Create".
Но я хочу ещё показать одну особенность работы PyCharm, из-за которой может не запускаться приложение через pycharm.
dockerfile и docker-compose.yml в настройке удалённого интерпретатора в Pycharm
Создадим docker-compose.yml
:
version: '3.8' services: web: build: context: . dockerfile: Dockerfile command: pipenv run python manage.py runserver 0.0.0.0:8000 image: vivazzi/vivivys restart: unless-stopped volumes: - .:/code ports: - "0.0.0.0:9001:8000" environment: POSTGRES_NAME: ${POSTGRES_DB} POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} depends_on: - db db: image: postgres hostname: postgres ports: - "7777:5432" environment: POSTGRES_DB: ${POSTGRES_DB} POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} volumes: - ./data/db:/var/lib/postgresql/data restart: unless-stopped
Обратите внимание, если вы используете ENTRYPOINT ["pipenv", "run","python","manage.py","runserver", "0.0.0.0:8000"]
в Dockerfile вместо command: pipenv run python manage.py runserver 0.0.0.0:8000
в docker-compose.yml, тогда PyCharm не сможет запустить ваше приложение (хотя, если вы запустите docker compose в терминале, вы нормально запустите приложение - это может сбить с толку). PyCharm попытается запустить ваше приложение примерно так:
/app/.venv/bin/python /opt/project/manage.py runserver pipenv run python manage.py runserver 0.0.0.0:8000
Как видите, это неправильная команда. Или, может быть, pipenv создаст виртуальную среду в корневой папке вместо использования сгенерированной виртуальной среды в папке .venv, поэтому приложение потеряет путь к установленным зависимостям.
Во многих статьях по Docker есть предупреждение о том, что для запуска приложения необходимо иметь команду ENTRYPOINT
или CMD
для запуска приложения. Но если вы используете docker-compose, вы должны отказаться от этих команд в файлах docker и добавить команду pipenv run python manage.py runserver 0.0.0.0:8000
в docker-compose.yml
. Вот тогда вы сможете использовать PyCharm для своей разработки.
Представляю вашему вниманию книгу, написанную моим близким другом Максимом Макуриным: Секреты эффективного управления ассортиментом.
Книга предназначается для широкого круга читателей и, по мнению автора, будет полезна специалистам отдела закупок и логистики, категорийным и финансовым менеджерам, менеджерам по продажам, аналитикам, руководителям и директорам, в компетенции которых принятие решений по управлению ассортиментом.
Комментарии: 0