как установить докер в режим роя - PullRequest
0 голосов
/ 21 февраля 2019

Я строю сетку селена, которая может содержать несколько браузеров для запуска сценария автоматизации, через некоторое время я нашел способ развернуть его в режиме роя.

version: '3'
networks:
  private:
    driver: overlay
services:
  selenium_hub:
    image: selenium/hub
    ports:
      - 4444:4444
    deploy:
      mode: global
      placement:
        constraints:
          - node.role == manager
    networks:
      - private

  firefox:
    image: selenium/node-firefox
    volumes:
      - /dev/urandom:/dev/random
    depends_on:
      - selenium_hub
    environment:
      - HUB_PORT_4444_TCP_ADDR=selenium_hub
      - HUB_PORT_4444_TCP_PORT=4444
      - NODE_MAX_SESSION=1
    entrypoint: bash -c 'SE_OPTS="-host $$HOSTNAME -port 5555" /opt/bin/entry_point.sh'
    ports:
      - "5555:5555"
    deploy:
      replicas: 1
    networks:
      - private

  chrome:
    image: selenium/node-chrome
    volumes:
      - /dev/urandom:/dev/random
    depends_on:
      - selenium_hub
    environment:
      - HUB_PORT_4444_TCP_ADDR=selenium_hub
      - HUB_PORT_4444_TCP_PORT=4444
      - NODE_MAX_SESSION=1
    entrypoint: bash -c 'SE_OPTS="-host $$HOSTNAME -port 5556" /opt/bin/entry_point.sh'
    ports:
      - 5556:5556
    deploy:
      replicas: 1
    networks:
      - private

Мой рой теперь может запускать веб-автоматизациюСкрипты с масштабом, но моя проблема заключается в том, чтобы улучшить сетку для эмуляторов Android и реальных устройств.Для того, чтобы реализовать мои требования, я нашел хороший пример, который позволяет мне развертывать сетку селена с эмуляторами Android, но я не могу преобразовать свой файл YAML в режим роя.

Я хочу знать, что я сделал неправильно, икакая разница между клавишами команды docker-compose и развертыванием стека докеров.

Данные, которые я хочу добавить:

  real_device:
    image: appium/appium
    depends_on:
      - selenium_hub
    network_mode: "service:selenium_hub"
    privileged: true
    volumes:
      - /dev/bus/usb:/dev/bus/usb
      - ~/.android:/root/.android
      - $PWD/example/sample_apk:/root/tmp
    environment:
      - CONNECT_TO_GRID=true
      - SELENIUM_HOST=selenium_hub
      # Enable it for msite testing
      #- BROWSER_NAME=chrome

  # Docker-Android for Android application testing
  nexus_7.1.1:
    image: budtmo/docker-android-x86-7.1.1
    privileged: true
    # Increase scale number if needed
    scale: 1
    depends_on:
      - selenium_hub
      - real_device
    ports:
      - 6080
    # Change path of apk that you want to test. I use sample_apk that I provide in folder "example"
    volumes:
      - $PWD/example/sample_apk:/root/tmp/sample_apk
      - ./video-nexus_7.1.1:/tmp/video
    environment:
      - DEVICE=Nexus 5
      - CONNECT_TO_GRID=true
      - APPIUM=true
      - SELENIUM_HOST=selenium_hub
      - AUTO_RECORD=true

  # Docker-Android for mobile website testing with chrome browser
  # Chrome browser exists only for version 7.0 and 7.1.1
  samsung_galaxy_web_7.1.1:
    image: budtmo/docker-android-x86-8.1
    privileged: true
    # Increase scale number if needed
    scale: 1
    depends_on: 
      - selenium_hub
      - real_device
    ports:
      - 6080
    volumes:
      - ./video-samsung_7.1.1:/tmp/video
    environment:
      - DEVICE=Samsung Galaxy S6
      - CONNECT_TO_GRID=true
      - APPIUM=true
      - SELENIUM_HOST=selenium_hub
      - MOBILE_WEB_TEST=true
      - AUTO_RECORD=true

  # Docker-Android for mobile website testing with default browser
  # Default browser exists only for version 5.0.1, 5.1.1 and 6.0
  samsung_galaxy_web_5.1.1:
    image: budtmo/docker-android-x86-5.1.1
    privileged: true
    # Increase scale number if needed
    scale: 1
    depends_on:
      - selenium_hub
      - real_device
    ports:
      - 6080
    volumes:
      - ./video-samsung_5.1.1:/tmp/video
    environment:
      - DEVICE=Samsung Galaxy S6
      - CONNECT_TO_GRID=true
      - APPIUM=true
      - SELENIUM_HOST=selenium_hub
      - MOBILE_WEB_TEST=true
      - AUTO_RECORD=true

1 Ответ

0 голосов
/ 21 февраля 2019

Привилегированные контейнеры в настоящее время не поддерживаются в режиме роя.Вы можете следить за прогрессом внедрения Docker здесь: https://github.com/docker/swarmkit/issues/1030

В качестве хакерского обходного пути, я видел, как некоторые пользователи запускали клиентский контейнер докера как сервис, монтировали сокет докера и запускали docker run --privileged --rm ... каккоманда в этом сервисе.

Пример хакерского обходного пути будет выглядеть так:

version: '3.5'
networks:
  private:
    name: selenium_private
    attachable: true
services:
  real_device:
    image: docker
    volumes:
    - /var/run/docker.sock:/var/run/docker.sock
    command:
    - docker
    - run
    - --rm
    - --privileged
    - -v
    - /dev/bus/usb:/dev/bus/usb
    - -v
    - /path/to/.android:/root/.android
    - -v
    - /path/to/example/sample_apk:/root/tmp
    - -e
    - CONNECT_TO_GRID=true
    - -e
    - SELENIUM_HOST=selenium_hub
    - --net
    - selenium_private
    - appium/appium

Единственный фрагмент, который я не включил, - это сеть.Похоже, что selenium хочет, чтобы все работало в едином сетевом пространстве имен, что будет немного сложно реализовать.Вы можете создать один фиктивный контейнер с известным именем вне режима роя и присоединить все к сетевому пространству имен этого контейнера.Если вы можете заставить его работать через оверлейную сеть для связи между службами (как работает большинство микросервисов), то я обновил определение частной сети, чтобы она была подключаемой, и дал ей имя (что требовало версию 3.5 compose).

...