Два варианта:
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, чтобы не терялись при пересоздании контейнеров.
Я использую это вариант, поскольку он работает заметно быстрее.