Hybrid Gitlab Runner: docker.sock and DinD in one environment

Remember warning in official Gitlab documentation?

"If you bind the Docker socket and you are using GitLab Runner 11.11 or later, you can no longer use docker:19.03.12-dind as a service. Volume bindings are done to the services as well, making these incompatible."

Once you may decide to run pipelines in passthrough mode or in Docker-in-Docker. As being told in Gitlab Runner documentation since you use passthrough mode you can not use Docker-in-Docker. So, you have to decide how to organize your CI/CD... Or follow this method and have advantages of both methods.

Solution lies in proper Gitlab Runner configuration. You must mount host Docker socket to runner container with different pathname. Then define it's address in environment. So, you will have ability to run in passthrough mode and not intersect with DinD service.

[ [runners]]
  environment = ["DOCKER_HOST=unix:///var/run/docker_parent.sock"]
  [runners.docker]
    image = "docker:stable"
    volumes = ["/var/run/docker.sock:/var/run/docker_parent.sock"]

To run job with DinD define DOCKER_HOST pointing to DinD in your .gitlab-ci.yaml

test:
  stage: test
  services:
    - docker:dind
  variables:
    DOCKER_DRIVER: overlay2
    DOCKER_TLS_CERTDIR: "/certs"
    DOCKER_HOST: "tcp://docker:2376"
  script:
    - echo $CI_BUILD_TOKEN | docker login -u $CI_REGISTRY_USER --password-stdin $CI_REGISTRY
    - docker pull $CI_REGISTRY_IMAGE/product:$CI_COMMIT_SHORT_SHA
    ...


Метки: ci/cdразработка

Просмотров:
Опубликовано: 15.10.2021