Jenkins构建Docker守护程序未在kubernetes群集上运行
我是devops新手,尝试使用Jenkins构建代码,并将其上传到托管在IBM云上的kubernetes集群上。但是,当我在Jenkins脚本中运行Docker run命令时,我不断得到这个错误。安装了所有最新的插件和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?. 这是詹金斯的剧
+ 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后,您需要遵循安装后的步骤
sudo groupadd docker
sudo usermod-aG docker$USER
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!