使用Docker容器化的Jenkins无法找到Docker。

3

我正在尝试建立一个Jenkins流水线,可以构建Docker镜像。但是在执行流水线后,我遇到了docker: not found的问题。 Jenkinsfile的内容如下:

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

这是一个简单的脚本,用于开始工作。但似乎docker化的Jenkins安装无法找到合适的docker安装程序来使用。

所需插件(DockerDocker pipeline)已安装,并且存在全局docker安装配置。但错误仍在继续。

使用此docker-compose进行Jenkins设置:

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

阅读了一些有关此问题的帖子并遵循官方Jenkins文档后,我认为这个目的使用了docker:dind。也许我在这里错过了一些重要的配置?在启动docker:dind容器时,日志会显示以下警告消息:could not change group /var/run/docker.sock to docker: group docker not found,但该组存在,我能够运行docker命令而无需指定sudo。(遵循官方docker安装后步骤)。
另一个问题是,Jenkins目前无法保留配置数据或流水线相关内容。重新启动计算机后,我必须每次都通过向导进行操作,我不知道为什么。
是否有人遇到过类似的问题?
非常感谢您的帮助!
2个回答

3
您的docker-compose文件是正确的,您只需要在jenkins容器中添加一个卷:
- /usr/bin/docker:/usr/bin/docker

您还有许多不必要的配置,您可以查看此链接来查看其他可能的配置。您目前使用的是Solution 3,您可以切换到此docker-compose文件。
对于卷,它们应该被持久化,因为它们在卷部分中声明。如果需要,您可以尝试使用外部卷

3
非常感谢您的优秀文章,解决了Docker找不到的问题。现在遇到了另一个问题:docker: /lib/x86_64-linux-gnu/libc.so.6: version GLIBC_2.32' not found (required by docker)。主机的GLIBC版本是ldd (Ubuntu GLIBC 2.33-0ubuntu5) 2.33`,这是怎么回事? - andreas.teich
你从哪里得到这个? - fmdaboville
在我的管道脚本中,出现了以下内容:+ docker inspect -f . node:14-alpine docker: /lib/x86_64-linux-gnu/libc.so.6: version GLIBC_2.32' not found (required by docker),以及几行下面的+ docker pull node:14-alpine docker: /lib/x86_64-linux-gnu/libc.so.6: version GLIBC_2.32' not found (required by docker) - andreas.teich
我不太清楚,但是我找到了一些关于它的解释:https://dev59.com/5a_la4cB1Zd3GeqPoB5Y#52827558 似乎你需要找到另一个版本。 - fmdaboville

0

快进一年,我遇到了类似的问题,只是GLIBC版本不匹配,如此处所述。

我通过将Jenkins容器中的GLIBC版本升级到2.35(与主机上的Ubuntu Jammy一起提供)来解决了这个问题。为了实现这一点,我不得不基于ubuntu:jammy和JDK 17构建自己的Jenkins容器,使用官方基于Debian的模板(从此处获取)。现在GLIBC版本已经一致,可以使用安装在Ubuntu Jammy主机上的docker进行docker-in-docker Jenkins构建:

$ ldd --version
ldd (Ubuntu GLIBC 2.35-0ubuntu3.1) 2.35

# vs.

$ docker run --rm -it mirekphd/jenkins-jdk17-on-ubuntu-2204:2.374 ldd --version
ldd (Ubuntu GLIBC 2.35-0ubuntu3.1) 2.35

随意使用此容器(最好使用latest标签),因为我将不得不维护它以供我们自己的内部使用,将其构建设置为其中一个Jenkins管道(引导问题除外)。这将是一个Docker-in-Docker Jenkins-in-Jenkins管道:)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接