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 вы можете:

  1. Использовать --system параметр pip install --system для установки пакетов глобально.
  2. Установить виртуальное окружение в корень проекта для получения точного неизменяемого пути к виртуальному окружению.

В этой статье я покажу второй вариант.

Создание виртуального окружения 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 из 5 (всего 0 оценок)

captcha
Отмеченные звёздочкой поля ( * ) являются обязательными для заполнения.

Спасибо за ваш отзыв!

После нажатия кнопки "Отправить" ваше сообщение будет доставлено мне на почту.

Автор статьи

Артём Мальцев

Веб-разработчик, владеющий знаниями языка программирования Python, фреймворка Django, системы управления содержимым сайта Django CMS, платформы для создания интернет-магазина Django Shop и многих различных приложений, использующих эти технологии.

Права на использование материала, расположенного на этой странице https://vivazzi.pro/ru/it/pipenv-with-docker-compose-in-pycharm/:

Разрешается копировать материал с указанием её автора и ссылки на оригинал без использования параметра rel="nofollow" в теге <a>. Использование:

Автор статьи: Артём Мальцев
Ссылка на статью: <a href="https://vivazzi.pro/ru/it/pipenv-with-docker-compose-in-pycharm/">https://vivazzi.pro/ru/it/pipenv-with-docker-compose-in-pycharm/</a>

Больше: Правила использования сайта

Представляю вашему вниманию книгу, написанную моим близким другом Максимом Макуриным: Секреты эффективного управления ассортиментом.

Книга предназначается для широкого круга читателей и, по мнению автора, будет полезна специалистам отдела закупок и логистики, категорийным и финансовым менеджерам, менеджерам по продажам, аналитикам, руководителям и директорам, в компетенции которых принятие решений по управлению ассортиментом.

Комментарии: 0

Вы можете оставить комментарий как незарегистрированный пользователь.

Но зарегистрировавшись, вы сможете:

  • получать оповещения об ответах
  • просматривать свои комментарии
  • иметь возможность использовать все функции разработанных сервисов

Для комментирования от своего имени войдите или зарегистрируйтесь на сайте Vuspace

Отправить

На данный момент нет специального поиска, поэтому я предлагаю воспользоваться обычной поисковой системой, например, Google, добавив "vivazzi" после своего запроса.

Попробуйте

Выберите валюту для отображения денежных единиц