Колба и селен-концентратор не связываются при стыковке - PullRequest
0 голосов
/ 10 декабря 2018

У меня проблемы с получением данных из контейнера docker-selenium через приложение Flask (также dockerized).

Когда приложение Flask работает в одном контейнере,Я получаю следующую ошибку на http://localhost:5000,, которая идет к драйверу селена с использованием удаленного драйвера, работающего на http://localhost:4444/wd/hub

Сгенерированная ошибка: urllib.error.URLError: <urlopen error [Errno 99] Cannot assign requested address>

Я создал репозиторий github с моим кодом для тестирования, см. здесь .

Мой файл docker-compose ниже выглядит нормально:

version: '3.5'
services:
  web:
    volumes:
      - ./app:/app
    ports:
      - "5000:80"
    environment:
      - FLASK_APP=main.py
      - FLASK_DEBUG=1
      - 'RUN=flask run --host=0.0.0.0 --port=80'
    command: flask run --host=0.0.0.0 --port=80
    # Infinite loop, to keep it alive, for debugging
    # command: bash -c "while true; do echo 'sleeping...' && sleep 10; done"

  selenium-hub:
    image: selenium/hub:3.141
    container_name: selenium-hub
    ports:
      - 4444:4444

  chrome:
    shm_size: 2g
    volumes:
      - /dev/shm:/dev/shm
    image: selenium/node-chrome:3.141
#    image: selenium/standalone-chrome:3.141.59-copernicium
    depends_on:
      - selenium-hub
    environment:
      - HUB_HOST=selenium-hub
      - HUB_PORT=4444

Что странночто когда я запускаю приложение Flask в Pycharm, а сетка селена работает в докере, я могу получить данные обратно через http://localhost:5000. Проблема возникает только тогда, когда приложение Flask работает в докере.

Заранее спасибо за помощь, дайте мне знать, если вам требуется дополнительная информация.


Редактировать

Поэтому я изменил свой файл docker-compose.yml, добавив в него сеть(обновил код в github. Как яd В коде приложения Flask, выполняемом в отладке и томе, любое обновление кода приводит к обновлению отладчика.

Я запустил docker network inspect в созданной сети и нашел IP-адрес локального докера:селен-концентратор.Я обновил код app/utils.py в get_driver(), чтобы использовать IP-адрес в command_executor вместо localhost.Сохранение и повторный запуск из моего браузера приводит к успешному возвращению данных.

Но я не понимаю, почему http://localhost:4444/wd/hub не будет работать, контейнеры Docker должны видеть друг друга в сети как localhost,право?

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

контейнеры Docker должны видеть друг друга в сети как localhost, верно?

Нет, это верно только в том случае, если они используют сеть хоста и выставляют порты через хост.

Когда у вас есть сервисы, взаимодействующие друг с другом в docker-compose (или в стеке), сервисы должны ссылаться друг на друга по имени сервиса .Например, вы бы достигли контейнера концентратора на http://selenium-hub:4444/wd/hub.Ваше приложение Flask может быть достигнуто другим контейнером в той же сети по адресу http://web

Вы можете быть смущены, если по умолчанию при запуске docker обычно используется хост-сеть, поскольку в сети хоста также выставлено selenium-hubна том же порту 4444. Итак, если вы запустили контейнер с хост-сетью, он мог бы также использовать http://localhost:4444.

0 голосов
/ 10 декабря 2018

Возможно, проблема связана с используемым портом, связанным с выполнением?

См .: Python urllib2: Невозможно назначить запрошенный адрес

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...