Jenkins构建Docker守护程序未在kubernetes群集上运行

Jenkins构建Docker守护程序未在kubernetes群集上运行,docker,jenkins,kubernetes,ibm-cloud,ibm-cloud-kubernetes,Docker,Jenkins,Kubernetes,Ibm Cloud,Ibm Cloud Kubernetes,我是devops新手,尝试使用Jenkins构建代码,并将其上传到托管在IBM云上的kubernetes集群上。但是,当我在Jenkins脚本中运行Docker run命令时,我不断得到这个错误。安装了所有最新的插件和 + docker run hello-world docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?. 这是詹金斯的剧

我是devops新手,尝试使用Jenkins构建代码,并将其上传到托管在IBM云上的kubernetes集群上。但是,当我在Jenkins脚本中运行Docker run命令时,我不断得到这个错误。安装了所有最新的插件和

+ docker run hello-world
docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?.
这是詹金斯的剧本,我不知道是对还是错。我搜索了几篇文章和一个问题。他们都没有给我一个积极的结果。 试过这个

这是我的詹金斯吊舱的部署文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: jenkins-uat
  labels:
    app: jenkins
    chart: jenkins-5.0.18
    release: jenkins-uat
    heritage: Helm
spec:
  selector:
    matchLabels:
      app: jenkins
      release: jenkins-uat
  template:
    metadata:
      labels:
        app: jenkins
        chart: jenkins-5.0.18
        release: jenkins-uat
        heritage: Helm
    spec:      
      securityContext:
        fsGroup: 1001
      containers:
        - name: jenkins
          image: docker.io/bitnami/jenkins:2.235.1-debian-10-r7
          imagePullPolicy: "IfNotPresent"
          securityContext:
            runAsUser: 1001
          env:
            - name: JENKINS_USERNAME
              value: "hlpjenkin"
            - name: JENKINS_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: jenkins-uat
                  key: jenkins-password
            - name: JENKINS_HOME
              value: "/opt/bitnami/jenkins/jenkins_home"
            - name: DISABLE_JENKINS_INITIALIZATION
              value: "no"
          ports:
            - name: http
              containerPort: 8080
            - name: https
              containerPort: 8443
          livenessProbe:
            httpGet:
              path: /login
              port: http
            initialDelaySeconds: 180
            periodSeconds: 10
            timeoutSeconds: 5
            successThreshold: 1
            failureThreshold: 6
          readinessProbe:
            httpGet:
              path: /login
              port: http
            initialDelaySeconds: 30
            periodSeconds: 5
            timeoutSeconds: 3
            successThreshold: 1
            failureThreshold: 3
          resources:
            limits: {}
            requests:
              cpu: 300m
              memory: 512Mi
          volumeMounts:
            - name: jenkins-data
              mountPath: /bitnami/jenkins
      volumes:
        - name: jenkins-data
          persistentVolumeClaim:
            claimName: jenkins-uat

我遇到了类似的问题,我通过允许我的用户成为docker组的一部分并执行docker来解决这个问题。当用户找不到docker时会发生这种情况

安装docker后,您需要遵循安装后的步骤

  • 创建docker组
    sudo groupadd docker

  • 将您的用户添加到docker组。
    sudo usermod-aG docker$USER

  • 重新启动docker服务
    sudo服务装卸工停止
    sudo服务装卸工启动

  • 从当前用户退出/注销并重新登录以验证


  • 因此,我在我的k8s集群中安装了Jenkins作为一个容器:),并设法重现了相同的错误:

    docker run --rm hello-world
    docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?.
    See 'docker run --help'.
    
    如何修复它

    为了修复此问题,您肯定需要访问K8s节点上的Docker。作者对其工作原理给出了很好的解释

    从技术上讲,您不需要“Docker中的Docker”(即Docker中的“完整Docker设置”)。您只希望能够从CI系统运行Docker,而此CI系统本身位于容器中。这样,您的CI系统(如Jenkins)就可以启动容器

    因此,当您启动CI容器(Jenkins或其他)时,不要在Docker中与Docker一起进行黑客攻击,而是在主主机上访问
    /var/run/Docker.sock

    在下面,您可以看到我的一部分,a对此负责。
    这允许我的CI容器访问Docker套接字,因此CI容器将能够启动容器

    除了启动“子”容器之外,它将启动“兄弟”容器,但在我们的上下文中这是非常好的

    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
    ...
    spec:
      template:
        spec:
          containers:
          - env:
            volumeMounts:
            - mountPath: /var/run/docker.sock
              name: docker-sock
          ...
          volumes:
          - hostPath:
              path: /var/run/docker.sock
              type: File
            name: docker-sock
    
    在我的例子中,我创建的管道生成以下日志:

    ####pipeline
    
    pipeline {
        agent any
    
        stages     {
            stage('second_stage'){
                steps{
                    sh 'docker run --rm hello-world'
                }
            }
        }
    }
    
    ####logs
    
    + docker run --rm hello-world
    
    Hello from Docker!
    

    因此,我在您的播客模板中看到了几个问题

    首先,对于docker容器,您没有指定任何图像。您应该在此容器中使用docker映像。使用安装了docker的容器创建自己的容器,也可以使用此图像。它包括IBM云上kubernetes自动化的ibmcloud cli、kubectl、helm和docker

    第二件事是,我认为这与詹金斯·库伯内特斯有关。一旦在管道中创建了一个podTemplate,即使编辑了该模板,有时在最新的pod中也看不到更改。我有这样的错误,所以我删除并用编辑过的podTemplate重新创建了管道。我这样说是因为即使您已经在podmetplate中声明了卷绑定,我也没有在创建的pod的yaml中看到它。因此,我建议您使用最终的pod模板重新创建管道


    我已经创建了一个关于如何在IBMKubernetes服务上安装、配置和自动化Jenkins管道的详细演练。请随意查看

    我在哪里可以执行sudo命令?我使用的是IBM kubernetesHow上的Jenkins,您是否使用Jenkins声明脚本运行这个“docker run hello world”。我只是在用hello world测试它image@FarrukhZeb,尝试
    docker-run-v/var/run/docker.sock:/var/run/docker.sock hello world
    (假设您已经挂载了
    hostPath:'/var/run/docker.sock'
    ),并让我们知道正确的结果:1)jenkins在IBM云中的Kubernetes上作为Pod运行。2) 您在Jenkins中尝试运行作业时遇到错误。@Nick是的,npm命令正在工作,只是Docker命令没有执行。Arrukh,我需要了解您的设置。这就是为什么我问我是否理解Jenkins本身在Inde容器中运行是正确的。您是否在IBM云中运行Jenkins作为Kubernetes上的Pod运行?可能有一些文档是你用来设置的(所以我可以复制)。到目前为止,詹金斯似乎联系不到多克。可能是docker未安装或未启动(因此应执行类似于
    sudo systemctl enable docker和&sudo systemctl restart docker
    的操作)@Nick I使用Helm在kubernetes上安装了Jenkins。我使用的回购协议是bitnami/Jenkins。创建持久卷声明、服务帐户并设置入口控制器。然后将其部署到我的集群中。所以詹金斯一家像豆荚一样运行。不幸的是,这对我不起作用。
    ####pipeline
    
    pipeline {
        agent any
    
        stages     {
            stage('second_stage'){
                steps{
                    sh 'docker run --rm hello-world'
                }
            }
        }
    }
    
    ####logs
    
    + docker run --rm hello-world
    
    Hello from Docker!