Search code examples
dockerjenkinsdocker-composejenkins-pipeline

Dockerized Jenkins not able to find docker


I'm trying to establish a Jenkins Pipeline, that's able to build docker images. But I ran into the problem docker: not found after executing the pipeline. The Jenkinsfile has the following content:

pipeline {
    agent { dockerfile true }
    stages {
        stage('Test') {
            steps {
                sh 'docker --version '
            }
        }
    }
}

It's a simple script to get things started. But it seems that the dockerized Jenkins installation can't find a suitable docker installation to use. The required plugins (Docker and Docker pipeline) are installed and a global docker installation configuration is present. But the error keeps going.

Jenkins setup is done by using this docker-compose:

version: '3.1'

networks:
  docker:

volumes:
  jenkins-data:
  jenkins-docker-certs:

services:

  jenkins:
    image: jenkins/jenkins:lts
    restart: always
    networks:
      - docker
    ports:
      - 8090:8080
      - 50000:50000
    tty: true
    volumes:
      - jenkins-data:/var/jenkins_home
      - jenkins-docker-certs:/certs/client:ro
      - $HOME:/home
    environment:
      - DOCKER_HOST=tcp://docker:2376
      - DOCKER_CERT_PATH=/certs/client
      - DOCKER_TLS_VERIFY=1

  dind:
    image: docker:dind
    privileged: true
    restart: always
    networks:
      docker:
        aliases:
          - docker
    ports:
      - 2376:2376
    tty: true
    volumes:
      - jenkins-data:/var/jenkins_home
      - jenkins-docker-certs:/certs/client
      - $HOME:/home
    environment:
      - DOCKER_TLS_CERTDIR=/certs

After reading some more posts about that issue and following the official Jenkins doc, I thought that for this purpose docker:dind is used. Maybe I miss some important configurations here? When launching the docker:dind container, the log states the following warning message: could not change group /var/run/docker.sock to docker: group docker not found, but the group exists and I'm able to run docker commands without specifying sudo. (Followed the official docker post-installation steps)

Another problematic point right now is, that Jenkins can't persist configuration data in general or pipeline related stuff. After restarting the machine I have to go through the wizard every single time and I don't know why.

Did someone suffer similar problems?

Many thanks in advice!


Solution

  • Your docker-compose file is correct, you just need to add a volume in the jenkins container :

    - /usr/bin/docker:/usr/bin/docker
    

    You have also a lot of configuration not required, you can check this link to see others possible configurations. You use actually the Solution 3 and you can switch to this docker-compose file.

    For volumes, they should be persisted since they are declared in the volume section. You can try to use external volumes if needed.