Skip to content

[🐛 Bug]: Dynamic Grid setup fails when the docker images are missing locally #11342

Closed
@krmahadevan

Description

@krmahadevan

What happened?

When we attempt at following the documentation of Dynamic Grid the docker node does not come up and crashes.

How can we reproduce the issue?

Ensure that you dont have any of the selenium related docker container images in your machine by running

  1. docker container prune to prune the images being used by stopped containers
  2. docker rmi $(docker images | grep selenium | awk '{print $3}') clean up all selenium images

Create a docker-compose file named docker-compose-v3-dynamic-grid.yml that looks like below:

# To execute this docker-compose yml file use `docker-compose -f docker-compose-v3-dynamic-grid.yml up`
# Add the `-d` flag at the end for detached execution
# To stop the execution, hit Ctrl+C, and then `docker-compose -f docker-compose-v3-dynamic-grid.yml down`
version: "3"
services:
  node-docker:
    image: selenium/node-docker:4.6.0-20221104
    volumes:
      - ./config.toml:/opt/bin/config.toml
    depends_on:
      - selenium-hub-dynamic
    environment:
      - SE_EVENT_BUS_HOST=selenium-hub-dynamic
      - SE_EVENT_BUS_PUBLISH_PORT=4442
      - SE_EVENT_BUS_SUBSCRIBE_PORT=4443
    ports:
      - "5005:5005"
     
  selenium-hub-dynamic:
    image: selenium/hub:4.6.0-20221104
    container_name: selenium-hub-dynamic
    ports:
      - "4442:4442"
      - "4443:4443"
      - "4455:4444"

In the same directory create a toml configuration file named config.toml with its contents as below:

[docker]
# Configs have a mapping between the Docker image to use and the capabilities that need to be matched to
# start a container with the given image.
configs = [
    "selenium/standalone-firefox:4.6.0-20221104", "{\"browserName\": \"firefox\"}",
    "selenium/standalone-chrome:4.6.0-20221104", "{\"browserName\": \"chrome\"}",
    "selenium/standalone-edge:4.6.0-20221104", "{\"browserName\": \"MicrosoftEdge\"}"
    ]
    
# URL for connecting to the docker daemon
# Most simple approach, leave it as http://127.0.0.1:2375, and mount /var/run/docker.sock.
# 127.0.0.1 is used because interally the container uses socat when /var/run/docker.sock is mounted 
# If var/run/docker.sock is not mounted: 
# Windows: make sure Docker Desktop exposes the daemon via tcp, and use http://host.docker.internal:2375.
# macOS: install socat and run the following command, socat -4 TCP-LISTEN:2375,fork UNIX-CONNECT:/var/run/docker.sock,
# then use http://host.docker.internal:2375.
# Linux: varies from machine to machine, please mount /var/run/docker.sock. If this does not work, please create an issue.
# I am on mac
url =  "http://host.docker.internal:2375"

# Docker image used for video recording
#video-image = "selenium/video:ffmpeg-4.3.1-20220531"

# Uncomment the following section if you are running the node on a separate VM
# Fill out the placeholders with appropriate values
#[server]
#host = "10.136.130.15"#<ip-from-node-machine>
#port = "5555"#<port-from-node-machine>

Setup socat forwarding (I am on Mac and so I installed socat and run the following command, socat -4 TCP-LISTEN:2375,fork UNIX-CONNECT:/var/run/docker.sock

Now bring up the nodes by running docker-compose -f docker-compose-v3-dynamic-grid.yml up



### Relevant log output

```shell
sunny-node-docker-1   | 10:31:07.650 INFO [PullImage.apply] - Pulling Reference{domain='docker.io', name='selenium/standalone-firefox', tag='4.6.0-20221104', digest='null'}
sunny-node-docker-1   | java.lang.reflect.InvocationTargetException
sunny-node-docker-1   |         at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sunny-node-docker-1   |         at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
sunny-node-docker-1   |         at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
sunny-node-docker-1   |         at java.base/java.lang.reflect.Method.invoke(Method.java:566)
sunny-node-docker-1   |         at org.openqa.selenium.grid.Bootstrap.runMain(Bootstrap.java:77)
sunny-node-docker-1   |         at org.openqa.selenium.grid.Bootstrap.main(Bootstrap.java:70)
sunny-node-docker-1   | Caused by: org.openqa.selenium.grid.config.ConfigException: java.lang.reflect.InvocationTargetException
sunny-node-docker-1   |         at org.openqa.selenium.grid.config.MemoizedConfig.getClass(MemoizedConfig.java:115)
sunny-node-docker-1   |         at org.openqa.selenium.grid.node.config.NodeOptions.getNode(NodeOptions.java:152)
sunny-node-docker-1   |         at org.openqa.selenium.grid.node.httpd.NodeServer.createHandlers(NodeServer.java:128)
sunny-node-docker-1   |         at org.openqa.selenium.grid.node.httpd.NodeServer.asServer(NodeServer.java:184)
sunny-node-docker-1   |         at org.openqa.selenium.grid.node.httpd.NodeServer.execute(NodeServer.java:239)
sunny-node-docker-1   |         at org.openqa.selenium.grid.TemplateGridCommand.lambda$configure$4(TemplateGridCommand.java:129)
sunny-node-docker-1   |         at org.openqa.selenium.grid.Main.launch(Main.java:83)
sunny-node-docker-1   |         at org.openqa.selenium.grid.Main.go(Main.java:57)
sunny-node-docker-1   |         at org.openqa.selenium.grid.Main.main(Main.java:42)
sunny-node-docker-1   |         ... 6 more
sunny-node-docker-1   | Caused by: java.lang.reflect.InvocationTargetException
sunny-node-docker-1   |         at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sunny-node-docker-1   |         at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
sunny-node-docker-1   |         at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
sunny-node-docker-1   |         at java.base/java.lang.reflect.Method.invoke(Method.java:566)
sunny-node-docker-1   |         at org.openqa.selenium.grid.config.ClassCreation.callCreateMethod(ClassCreation.java:50)
sunny-node-docker-1   |         at org.openqa.selenium.grid.config.MemoizedConfig.lambda$getClass$4(MemoizedConfig.java:100)
sunny-node-docker-1   |         at java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1737)
sunny-node-docker-1   |         at org.openqa.selenium.grid.config.MemoizedConfig.getClass(MemoizedConfig.java:95)
sunny-node-docker-1   |         ... 14 more
sunny-node-docker-1   | Caused by: java.lang.IllegalArgumentException: non-positive contentLength: 0
sunny-node-docker-1   |         at java.net.http/java.net.http.HttpRequest$BodyPublishers.fromPublisher(HttpRequest.java:539)
sunny-node-docker-1   |         at org.openqa.selenium.remote.http.jdk.JdkHttpMessages.notChunkingBodyPublisher(JdkHttpMessages.java:124)
sunny-node-docker-1   |         at org.openqa.selenium.remote.http.jdk.JdkHttpMessages.createRequest(JdkHttpMessages.java:76)
sunny-node-docker-1   |         at org.openqa.selenium.remote.http.jdk.JdkHttpClient.execute(JdkHttpClient.java:280)
sunny-node-docker-1   |         at org.openqa.selenium.remote.tracing.TracedHttpClient.execute(TracedHttpClient.java:55)
sunny-node-docker-1   |         at org.openqa.selenium.docker.v1_41.PullImage.apply(PullImage.java:63)
sunny-node-docker-1   |         at org.openqa.selenium.docker.v1_41.V141Docker.getImage(V141Docker.java:80)
sunny-node-docker-1   |         at org.openqa.selenium.docker.Docker.lambda$getImage$0(Docker.java:51)
sunny-node-docker-1   |         at java.base/java.util.Optional.map(Optional.java:265)
sunny-node-docker-1   |         at org.openqa.selenium.docker.Docker.getImage(Docker.java:51)
sunny-node-docker-1   |         at org.openqa.selenium.grid.node.docker.DockerOptions.lambda$loadImages$4(DockerOptions.java:260)
sunny-node-docker-1   |         at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1700)
sunny-node-docker-1   |         at java.base/java.lang.Thread.run(Thread.java:829)
sunny-node-docker-1   | Exception in thread "Thread-0" java.lang.NullPointerException
sunny-node-docker-1   |         at org.openqa.selenium.grid.node.httpd.NodeServer.lambda$new$0(NodeServer.java:80)
sunny-node-docker-1   |         at java.base/java.lang.Thread.run(Thread.java:829)
sunny-node-docker-1   | 2022-12-01 10:31:08,079 INFO exited: selenium-grid-docker (exit status 1; not expected)

Operating System

macOS

Selenium version

Java 4.6.0

What are the browser(s) and version(s) where you see this issue?

Not relevant

What are the browser driver(s) and version(s) where you see this issue?

Not relevant

Are you using Selenium Grid?

4.6.0

Metadata

Metadata

Assignees

No one assigned

    Labels

    B-gridEverything grid and server relatedI-defectSomething is not working as intended

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions