Как эффективно разрабатывать приложения на Python в Pycharm используя Docker?

Использую pycharm для разработки Django приложений.
Стандартный процесс разработки: берем virtualenv, туда всё ставим, в pycharm указываем эту виртуалку в качестве сдк для проекта всё здорово.
Решив использовать docker, столкнулся с некоторыми проблемами. В частности, меня интересет следующее:
0.1. В различных гайдах, засовывают nginx в контейнер, не понятно зачем это делается, если на прод серваке все равно будет свой nginx.
1.Если мы отказываемся от virtualenv и все окружение у нас в контейнере, то как в pycharm-e указать путь до него, а если быть точнее то как в docker-machine добавить контейнеры с локальной машины, ведь в pycharme окружение можно брать лишь через docker-machine.
2.Так же пока не не нашел решения - почему pdb.set_trace() при срабатывании сразу же вылетает, при запуске из контейнера.
3.И вообще интересует как лучше организвать структуру каталогов для докерфайлов, компосов, сорцов, статики, медии
  • Вопрос задан
  • 10224 просмотра
Пригласить эксперта
Ответы на вопрос 3
sim3x
@sim3x
0. nginx (проксирующий сервак) вставляют в контейнер если основному прокси нельзя указать где у тебя статика лежит
схема

#### server
балансер(прокси) | {твой контейнер: nginx -> [static_files, dynamic_django]
                 | {другой контейнер: nginx -> [static_files, dynamic]
....
#### server


1. https://github.com/docker-library/python/blob/12db...
питон компайлится в свой дефолтний путь /usr/local/bin/python

1. 2. blog.jetbrains.com/pycharm/2015/10/announcing-pych...
проверь пайчарм на наличие фичи или поставь EAP

3. Желательно делать структуру максимально плоской - без кучу вложенных директорий
https://docs.docker.com/compose/django/
Ответ написан
@puker-ti Автор вопроса
Ну либо я очень плохо объясняю, либо предыдущий оратор меня никак не мог понять, либо еще что-то, но вот на часть вопросов я нашел ответ:
  • 0.1.
    Исходя из предыдущего ответа и судя по этой ссылке https://www.digitalocean.com/community/tutorials/d...
    afford you to port applications easily, scale fast and add another layer to your host's (i.e. droplets) security

    Добавление nginx в контейнер - - лишь еще одна прослойка для еще большего секьюрити, еще большей изоляции.

  • 1.
    Если у нас уже стоит docker-engine в системе, и мы хотим нашу же систему завести под провижнинг докер машины, то все по тем же докам
    https://docs.docker.com/machine/overview/
    https://docs.docker.com/machine/drivers/generic/
    делаем
    docker-machine create --driver=generic --generic-ip-address=localhost --generic-ssh-user=username machinename

    т.е. подключаемся через ssh к самому себе.
    Однако необоходимо проверить стоит ли в системе ssh сервер which sshd и если не стоит то поставить такой, например sudo apt-get install openssh-server
    Однако это еще не все, так же необходимо будет настроить возможность подключения через ssh без пароля.
    Возможно тут поможет ключ --generic-ssh-key для docker-machine create, но я с этим не разбирался, а через sudo visudo позволил своему пользователю делать всё без пароля, добавив строку username ALL=(ALL) NOPASSWD: ALL
    И теперь наконец у нас добавлена в docker-machine своя же система, и теперь в пайчарме выбираем внешний сдк, в списке докер машин, выбираем нашу и видим все контейнеры в системе.
    ...Однако пачарм все равно подекрикавет вс импорты красным

  • 2.
    судя по этим вопросам
    stackoverflow.com/questions/13715725/python-pdb-ex...
    stackoverflow.com/questions/9178751/use-pdb-set-tr...
    я так понял, что stdin чем то занят и там нет места нашему жалкому дебагеру. Из возможных решений:
    перенаправлять ввод пдб куда то еще, либо использовать другой отладчик, позволяющий это из коробки...вобще неудобно все както. Хотя если кто то сможет описать формально шаги как это сделать, желатьльно с ipdb - будет круто.

  • 3.
    https://realpython.com/blog/python/django-developm...
    вот тут помоему вполне адекватное дерево, если можете, накидайте репозиториев с хорошими проектами, где можно на это вживую посмотреть.
    ├── docker-compose.yml
    ├── nginx
    │   ├── Dockerfile
    │   └── sites-enabled
    │       └── django_project
    ├── production.yml
    └── web
        ├── Dockerfile
        ├── docker_django
        │   ├── __init__.py
        │   ├── apps
        │   │   ├── __init__.py
        │   │   └── todo
        │   │       ├── __init__.py
        │   │       ├── admin.py
        │   │       ├── models.py
        │   │       ├── templates
        │   │       │   ├── _base.html
        │   │       │   └── home.html
        │   │       ├── tests.py
        │   │       ├── urls.py
        │   │       └── views.py
        │   ├── settings.py
        │   ├── urls.py
        │   └── wsgi.py
        ├── manage.py
        ├── requirements.txt
        └── static
            └── main.css


Ответ написан
Комментировать
funca
@funca
Два варианта:
1. Использовать нативную поддержку докера в PyCharm.

Интеграция по всей видимости рассчитана на docker-machine и boot2docker. Но если хочется использовать docker из хост-сиситемы, то настраивать docker-machine и ssh не обязательно. Вместо этого можно использовать скрипт-заглушку из https://youtrack.jetbrains.com/issue/PY-17454#comm... Путь к docker-machine заглушке указать в настройках PyCharm.

В систему необходимо добавить пользователя "docker" с паролем "tcuser". Эти реквизиты использует дебагер.
sudo useradd --system --create-home --home /var/lib/docker docker
echo 'docker:tcuser' | chpasswd


Если дебагер не может подключиться к контейнеру, чинится добавлением IP адреса 10.0.2.2/8 интерфейсу docker0:
sudo iptables -A INPUT -i docker0 -j ACCEPT
sudo ip addr add 10.0.2.2/8 dev docker0 \
        && (sudo ip link set dev docker0 down; sudo ip link set dev docker0 up) ||:


Интеграции с docker-compose нет. PyCharm будет запускать контейнеры самостоятельно, поэтому провязку с внешними сервисами придется костылять отдельно. Через .env файлы, например.

2. Использовать обычный удаленный доступ по SSH.

В этом случае для разработки нужно создать отдельный image, с доустановленным sshd и инструментами разработки.
# за основу берется проектный image
FROM myproject

# sshd
RUN apt-get update \
    && apt-get install -y --no-install-recommends \
           openssh-server \
           vim \
    && rm -rf /var/lib/apt/lists/* \
    && mkdir -p -m0755 /var/run/sshd \
    && echo 'root:screencast' | chpasswd \
    && sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/' /etc/ssh/sshd_config \
    && sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd \
    && echo "export VISIBLE=now" >> /etc/profile

# PyCharm хочет исходники в /opt/project
WORKDIR /opt/project

# автоматически активировать virtualenv при логине root 
RUN echo "\ncd /opt/project; if [ ! -f env/bin/activate ]; then virtualenv env; fi; . env/bin/activate" >> /root/.bashrc

# ssh, django runserver
EXPOSE 22 8000
CMD ["/usr/sbin/sshd", "-D"]

После этого проект и зависимости можно запускать один раз через docker-compose up -d, а в PyCharm - настроить интеграцию с контейнером через обычный удаленный доступ по SSH.
# docker-compose-dev.yml
# vim: sw=2 ts=2
version: '2'
services:
  web:
    build: .
    links:
      - db
    volumes:
      - ./:/opt/project
      - ./data/env:/opt/project/env
    ports:
      - "127.0.0.1:2222:22"
      - "127.0.0.1:8000:8000"
  db:
    image: mysql
    volumes:
      - ./data/mysql:/var/lib/mysql
    environment:
      - MYSQL_ALLOW_EMPTY_PASSWORD=yes
      - MYSQL_DATABASE=mydb
    ports:
      - "3306:3306"

В примере исходники, virtualenv и директория с данными для MySQL монтируются через volume, чтобы не терялись при пересоздании контейнеров.

Я использую это вариант, поскольку он работает заметно быстрее.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы