Running gitlab-runner with multiple docker daemons

Viewed 1014

I'm trying to have several gitlab runners using different docker daemons on the same host

Currently using gitlab-runner 10.7.0 and docker 19.03.3. The goal is to maximize the usage of resources. Since I have two SSD disks on the machine, I want the runners to use both of them. The only way I found to have some runners use one disk while some others use the other disk is to have two docker daemons, one running on each disk.

I have one docker daemon running on unix:///var/run/docker-1.sock and one on unix:///var/run/docker-2.sock. They use each a dedicated bridge created manually. The (systemd) startup command line looks like /usr/bin/dockerd --host unix:///var/run/docker_socket/docker-%i.sock --containerd=/run/containerd/containerd.sock --pidfile /var/run/docker-%i.pid --data-root /data/local%i/docker/ --exec-root /data/local%i/docker_run/ --bridge docker-%i --fixed-cidr 172.%i0.0.1/17

The gitlab_runner mounts /var/run/docker_socket/ and runs on docker-1.sock. I tried having one per docker daemon but then two jobs runs on the same runner although the limit is set to 1 (and also there are some sometimes errors appearing like ERROR: Job failed (system failure): Error: No such container: ...)

After registration the config.toml looks like:

concurrent = 20
check_interval = 0

[[runners]]
  name = "[...]-large"
  limit = 1
  output_limit = 32768
  url = "[...]"
  token = "[...]"
  executor = "docker"
  [runners.docker]
    host = "unix:///var/run/docker-1.sock"
    tls_verify = false
    image = "debian:jessie"
    memory = "24g"
    cpuset_cpus = "1-15"
    privileged = false
    security_opt = ["seccomp=unconfined"]
    disable_cache = false
    volumes = ["/var/run/docker-1.sock:/var/run/docker.sock"]
    shm_size = 0
  [runners.cache]


[[runners]]
  name = "[...]-medium-1"
  limit = 1
  output_limit = 32768
  url = "[...]"
  token = "[...]"
  executor = "docker"
  [runners.docker]
    host = "unix:///var/run/docker-2.sock"
    tls_verify = false
    image = "debian:jessie"
    memory = "12g"
    cpuset_cpus = "20-29"
    privileged = false
    security_opt = ["seccomp=unconfined"]
    disable_cache = false
    volumes = ["/var/run/docker-2.sock:/var/run/docker.sock"]
    shm_size = 0
  [runners.cache]

The two docker daemons are working fine. Tested with docker --host unix:///var/run/docker-<id>.sock ps

The current solution seems to be kind of OK but there are random errors in the gitlab_runner logs: ERROR: Appending trace to coordinator... error couldn't execute PATCH against http://[...]/api/v4/jobs/223116/trace: Patch http://[...]/api/v4/jobs/223116/trace: read tcp [...] read: connection reset by peer runner=0ec8a845

1 Answers

Other people tried this, apparently with some success:

NB: Docker documentation says the feature is experimental: https://docs.docker.com/engine/reference/commandline/dockerd/#run-multiple-daemons

Related