0
votes

I have the following docker-compose.yml which starts a chrome-standalone container and a nodejs application:

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'

I'm running the containers as follows:

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

and starting the e2e from within the shell.

When running the e2e tests, selenium can be reached from the node container(through: http://selenium:4444), but node isn't reachable from the selenium container.

I have tested this by VNC'ing into the selenium container and pointing the browser to: http://node:8090. (The node container is reachable on the host however, through: http://localhost:8090).

I first thought that docker-compose run doesn't add the running container to the proper network, however by running docker network inspect test_app I get the following:

[
{
    "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"
    }
}
]

Which shows both containers running on the "selenium" network. I'm not sure however if the node container is properly aliased on the network and if this is proper behaviour.

Am I missing some config here?

1

1 Answers

0
votes

Seems like docker-compose run names the container differently to evade the service namespace as noted in docker-compose.yml. http://node:8090 was therefore not reachable.

I solved this by adding a --name flag as follows:

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

EDIT:

It took me a while to notice, but I was overcomplicating the implementation by a lot. The above docker-compose.yml can be simplified by adding host networking. This simply exposes all running containers on localhost and makes them reachable on localhost by their specified ports. Considering that I don't need any encapsulation (it's meant for dev), the following docker-compose.yml sufficed:

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'