我是Dev Ops的新手,并尝试使用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?.
这是我不知道对与错的詹金斯脚本。我搜索了几篇文章和问题。他们都没有给我积极的结果。 尝试过此Jenkins Docker in Docker on GCP/Kubernetes。
podTemplate(
cloud: "kubernetes",
label:"mypod",
containers:[
containerTemplate(
name:"nodejs",
image:"node",
ttyEnabled:true,
command:'cat',
alwaysPullImage: true,
resourceRequestCpu: '200m',
resourceRequestMemory: '100Mi',
),
containerTemplate(
name:"docker",
image:"",
ttyEnabled:true,
command:'cat',
alwaysPullImage: true,
resourceRequestCpu: '200m',
resourceRequestMemory: '100Mi',
),
containerTemplate(
name:"helm",
image:"alpine/helm",
ttyEnabled:true,
command:'cat',
alwaysPullImage: true,
resourceRequestCpu: '200m',
resourceRequestMemory: '100Mi',
)
],
volumes:[
hostPathVolume(hostPath: '/var/run/docker.sock', mountPath: '/var/run/docker.sock')
]
){
node("mypod"){
def commitId
stage ("Fetch repo"){
checkout scm
commitId = sh(script: 'git rev-parse --short HEAD',returnStdout:true).trim()
}
stage ("Installing packages"){
container("nodejs"){
sh 'npm install'
}
}
stage ("Build"){
container("nodejs"){
sh 'npm run build'
}
}
def repository
stage ("Docker"){
container('docker'){
docker.withRegistry("https://us.icr.io/api","ibm-cloud"){
sh "docker run hello-world"
}
}
}
stage ("Deploy"){
container ("helm"){
sh 'helm version'
}
}
}
}
这是我的Jenkins吊舱的部署文件
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
答案 0 :(得分:1)
我遇到了类似的问题,并通过使用户成为docker组的一部分并执行docker来解决此问题。当您的用户无法找到docker时,就会发生这种情况。
在安装docker之后,您需要按照安装后的步骤进行操作。
创建docker组
ValueError: Expected n_neighbors <= n_samples, but n_samples = 1, n_neighbors = 2
将您的用户添加到docker组。
sudo groupadd docker
重新启动docker服务
sudo usermod -aG docker $USER
和sudo service docker stop
从当前用户退出/注销并重新登录以验证
答案 1 :(得分:1)
因此,我已将Jenkins作为容器安装在我的k8s集群中:),并设法再现相同的错误:
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。 jpetazzo给出了很好的解释。
从技术上讲,您不需要“ Docker in Docker”(即Docker中的“完整Docker设置”)。您只希望能够从CI系统中运行Docker,而此CI系统本身位于容器中。这样您的CI系统(如Jenkins)就可以启动容器。
因此,当您启动CI容器(Jenkins或其他)时,不要与Docker-in-Docker一起入侵某些东西,而应通过访问主主机上的/var/run/docker.sock
来启动它。
在下面,您可以看到我的Yamls中对此负责的部分。
这样我的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!
答案 2 :(得分:0)
所以我在您的podtemplate中看到了几个问题。
首先,对于docker容器,您未指定任何图像。您应该在此容器中使用docker映像。使用安装了docker的容器创建您自己的容器,或者您可以使用https://hub.docker.com/r/volaka/ibm-cloud-cli此映像。它包括用于IBM Cloud上的kubernetes自动化的ibmcloud cli,kubectl,helm和docker。
第二件事是,我认为它与Jenkins Kubernetes有关。在管道中创建podTemplate之后,即使您编辑模板,有时更改也不会在最新的pod中显示。我遇到了此类错误,因此我使用编辑的podTemplate删除并重新创建了管道。我说这是因为,即使您在podTemplate中声明了卷绑定,在创建的pod的Yaml中也看不到它。因此,我建议您使用最终的podTemplate重新创建管道。
我创建了详细的演练,内容涉及如何在IBM Kubernetes Service上安装,配置和自动化Jenkins管道。随时检查。 https://volaka.gitbook.io/jenkins-on-k8s/