Selenium не может получить доступ к Docker-контейнеру с помощью docker-compose run - PullRequest
0 голосов
/ 30 июня 2019

У меня есть следующий docker-compose.yml, который запускает контейнер chrome-standalone и приложение nodejs:

version: '3.7'

networks:
  selenium:

services:
  selenium:
    image: selenium/standalone-chrome-debug:3
    networks:
      - selenium
    ports:
      - '4444:4444'
      - '5900:5900'
    volumes:
      - /dev/shm:/dev/shm
    user: '7777:7777'

  node:
    image: node_temp:latest
    build:
      context: .
      target: development
      args:
        UID: '${USER_UID}'
        GID: '${USER_GID}'
    networks:
      - selenium
    env_file:
      - .env
    ports:
      - '8090:8090'
    volumes:
      - .:/home/node
    depends_on:
      - selenium
    command: >
      sh -c 'yarn install &&
             yarn dev'

Я запускаю контейнеры следующим образом:

docker-compose up -d selenium
docker-compose run --service-ports node sh

и запуск e2e из оболочки.

При выполнении тестов e2e селен может быть достигнут из контейнера узла (через: http://selenium:4444),, но узел недоступен из контейнера с селеном.

Я проверял этоVNC'ing в контейнере селена и указание браузеру на: http://node:8090. (Контейнер узла доступен на хосте , однако, через: http://localhost:8090).

I сначалаЯ думал, что docker-compose run не добавляет работающий контейнер в нужную сеть, однако, запустив docker network inspect test_app, я получаю следующее:

[
{
    "Name": "test_app_selenium",
    "Id": "df6517cc7b6446d1712b30ee7482c83bb7c3a9d26caf1104921abd6bbe2caf68",
    "Created": "2019-06-30T16:08:50.724889157+02:00",
    "Scope": "local",
    "Driver": "bridge",
    "EnableIPv6": false,
    "IPAM": {
        "Driver": "default",
        "Options": null,
        "Config": [
            {
                "Subnet": "172.31.0.0/16",
                "Gateway": "172.31.0.1"
            }
        ]
    },
    "Internal": false,
    "Attachable": true,
    "Ingress": false,
    "ConfigFrom": {
        "Network": ""
    },
    "ConfigOnly": false,
    "Containers": {
        "8a76298b237790c62f80ef612debb021549439286ce33e3e89d4ee2f84de3aec": {
            "Name": "test_app_node_run_78427bac2fd1",
            "EndpointID": "04310bc4e564f831e5d08a0e07891d323a5953fa936e099d20e5e384a6053da8",
            "MacAddress": "02:42:ac:1f:00:03",
            "IPv4Address": "172.31.0.3/16",
            "IPv6Address": ""
        },
        "ef087732aacf0d293a2cf956855a163a081fc3748ffdaa01c240bde452eee0fa": {
            "Name": "test_app_selenium_1",
            "EndpointID": "24a597e30a3b0b671c8b19fd61b9254bea9e5fcbd18693383d93d3df789ed895",
            "MacAddress": "02:42:ac:1f:00:02",
            "IPv4Address": "172.31.0.2/16",
            "IPv6Address": ""
        }
    },
    "Options": {},
    "Labels": {
        "com.docker.compose.network": "selenium",
        "com.docker.compose.project": "test_app",
        "com.docker.compose.version": "1.24.1"
    }
}
]

, который показывает оба контейнера, работающие в сети "selenium".Однако я не уверен, правильно ли настроен псевдоним контейнера узла в сети и правильное ли это поведение.

Мне не хватает какой-либо конфигурации здесь?

1 Ответ

0 голосов
/ 30 июня 2019

Похоже, что docker-compose run именует контейнер по-разному, чтобы обойти пространство имен службы, как отмечено в docker-compose.yml. http://node:8090 поэтому было недоступно.

Я решил это, добавив флаг --name следующим образом:

docker-compose run --service-ports --name node node sh

EDIT:

Мне потребовалось некоторое время, чтобы заметить, но я сильно усложнил реализацию. Приведенный выше docker-compose.yml можно упростить, добавив хост-сеть. Это просто открывает все запущенные контейнеры на локальном хосте и делает их доступными на локальном хосте по указанным портам. Учитывая, что мне не нужна инкапсуляция (она предназначена для dev), достаточно следующего docker-compose.yml:

version: '3.7'

services:
  selenium:
    image: selenium/standalone-chrome:3
    # NOTE: port definition is useless with network_mode: host
    network_mode: host
    user: '7777:7777'

  node:
    image: node_temp:latest
    build:
      context: .
      target: development
      args:
        UID: '${USER_UID}'
        GID: '${USER_GID}'
    network_mode: host
    env_file:
      - .env
    volumes:
      - .:/home/node
    command: >
      sh -c 'yarn install &&
             yarn dev'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...