2015-05-21 3 views
4

Давайте предположим, у меня есть следующий docker-compose.yml файл работает два различных приложений питона параллельно (например, через колбу):Отладка связанных Docker контейнеров при использовании докер-компоновать

app1: 
    command: python app.py 
    build: app1/ 

app2: 
    command: python app.py 
    build: app2/ 
    links: 
    - app1 

app2 связан с app1, так как я хочу, чтобы получить конкретные данные от app1 внутри него. Теперь моя проблема - это определенный сценарий, когда я хочу отлаживать эту ссылку. Я могу легко отлаживать app1 и app2 как автономные контейнеры (через docker-compose run --service-ports ... python app.py и размещение pdb где-то в коде). Моя проблема в том, когда я хочу отлаживать app1, если запрос исходит от app2. Если я начинаю app1 с docker-compose run, то app2 не может решить эту проблему. Эта проблема становится еще более проблематичной, когда большее количество приложений/сервисов «разговаривает» друг с другом в зависимости от их ссылок.

Есть ли хороший способ справиться с этим? Как вы относитесь к проблеме отладки со связанными контейнерами вообще (не обязательно python specificc)? Спасибо за ввод.

+0

Не работает ли он, если вы запустите сервис 'app2' с se порты rvice? Подобно 'docker-compose run --service-ports app2'. Если нет, вы можете запустить службу «app1» со служебными портами, захватить имя контейнера, а затем запустить вторую службу «app2», связав ее вручную с запущенным «app1» (используя '--link'). Или, возможно, вам даже не нужно предоставлять ссылку, если 'app1' уже запущен (с портом обслуживания), и это экземпляр ** только ** этой службы запущен, запуск' app2' должен автоматически подключаться к нему. – linkyndy

+0

Если я запускаю обе службы с флагом '--service-ports', можно запускать' app1', но 'app2' не может запускаться, потому что он пытается запустить связанный контейнер для' app1' отдельно. Если я использую '-no-deps', ссылка не будет установлена. Ваше второе решение будет работать, но его сложно автоматизировать. Также я хотел бы остаться в границах 'docker-compose' и не использовать простой' docker', если это не необходимо. –

+0

Я нашел одно обходное решение, которое в настоящее время работает для меня. При запуске каждого контейнера для отладки я запускаю их с флагами '--service-ports' и' --no-deps'. Для того, чтобы они могли общаться, мне также нужно передать IP-адрес хост-машин в качестве переменной среды и открыть порты каждого контейнера. IP-адрес хоста автоматически доступен из каждого контейнера докера, поэтому я могу делать запросы туда вместо того, чтобы делать запросы к IP из ссылки. Также мне нужно запустить все промежуточные контейнеры, подобные этому. Тем не менее, это единственный способ обхода проблемы. Я предпочел бы иметь встроенное решение. –

ответ

4

Если вы разрабатываете локально на одном компьютере, то вы можете добавить net: 'host' в конфигурацию, которая выполняет следующие действия:

Сообщает Docker пропустить размещение контейнера внутри отдельного сетевого стека. По сути, этот выбор говорит Docker о том, чтобы не контейнерная сеть контейнеров!

Для получения дополнительной информации см the documentation

app1: 
    command: python app.py 
    build: app1/ 
    net: 'host' 

app2: 
    command: python app.py 
    build: app2/ 
    net: 'host' 

Кроме того, вы должны начать APP1 в режиме демона и app2 в режиме переднего плана для целей отладки:

docker-compose up -d app1 
docker-compose run app2 

Как только вы получите запрос от app1 к app2, вы опуститесь до (pdb) в app2

 Смежные вопросы

  • Нет связанных вопросов^_^