【发布时间】:2021-07-04 18:19:02
【问题描述】:
我正在尝试创建允许在同一主机上构建 Docker 映像和 Jenkins 的 Kubernetes 部署。这是我在 jenkins-docker-in-docker 部署中的 Docker 和 Jenkins 容器中包含 Docker 的部署的 YAML 配置:
apiVersion: apps/v1
kind: Deployment
metadata:
name: jenkins-docker-in-docker
spec:
selector:
matchLabels:
app: jenkins-docker-in-docker
replicas: 1
template:
metadata:
labels:
app: jenkins-docker-in-docker
spec:
containers:
- name: dind-daemon
image: docker:18.01.0-dind
resources:
requests:
cpu: 20m
memory: 512Mi
securityContext:
privileged: true
volumeMounts:
- name: docker-graph-storage
mountPath: /var/lib/docker
- name: docker-cmds
image: docker:18.01.0
command: ['docker', 'run', '-p', '80:80', 'httpd:latest']
resources:
requests:
cpu: 10m
memory: 256Mi
env:
- name: DOCKER_HOST
value: tcp://localhost:2375
- name: ml-services
image: trion/jenkins-docker-client
ports:
- containerPort: 8080
使用从https://www.jenkins.io/doc/tutorials/build-a-java-app-with-maven/ 复制的简单管道:
pipeline {
agent {
docker {
image 'maven:3-alpine'
args '-v /root/.m2:/root/.m2'
}
}
stages {
stage('Build') {
steps {
sh 'mvn -B -DskipTests clean package'
}
}
}
}
当我尝试构建时收到此错误:
First time build. Skipping changelog.
[Pipeline] }
[Pipeline] // stage
[Pipeline] withEnv
[Pipeline] {
[Pipeline] isUnix
[Pipeline] sh
+ docker inspect -f . maven:3-alpine
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
[Pipeline] isUnix
[Pipeline] sh
+ docker pull maven:3-alpine
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
ERROR: script returned exit code 1
Finished: FAILURE
我现在看来不正确的理解是容器dind-daemon、docker-cmds 和ml-services 容器存在于同一个部署中,在本例中名为jenkins-docker-in-docker。因此,Docker 和 Jenkins 应该在jenkins-docker-in-docker 上可用?
是不是我错误地配置了 Kubernetes 文件?
更新:
我修改了yaml来设置DOCKER_HOST环境变量:
- name: ml-services
env:
- name: DOCKER_HOST
value: "dind-daemon:2375"
image: trion/jenkins-docker-client
ports:
- containerPort: 8080
Jenkins 的错误现在是:
- 码头检查 -f 。 maven:3-alpine
连接时出错:获取 http://dind-daemon:2375/v1.40/containers/maven:3-alpine/json: 拨号 tcp:在 10.245.0.10:53 上查找 dind-daemon:没有这样的主机 [管道] isUnix [管道] sh
- docker pull maven:3-alpine 连接期间出错:发布 http://dind-daemon:2375/v1.40/images/create?fromImage=maven&tag=3-alpine: 拨打 tcp:在 10.245.0.10:53 上查找 dind-daemon:没有这样的主机 [管道] } [管道] // withEnv [管道] } [管道] // 节点 [管道] 管道错误结束:脚本返回退出代码 1 完成:失败
我需要在 10.245.20.10:53 上公开 docker 守护进程吗?
更新 2:
在接受答案的帮助下,我使用以下部署完成了这项工作:
apiVersion: apps/v1
kind: Deployment
metadata:
name: jenkins-docker-in-docker1.1
spec:
selector:
matchLabels:
app: jenkins-docker-in-docker1.1
replicas: 1
template:
metadata:
labels:
app: jenkins-docker-in-docker1.1
spec:
containers:
- name: dind-daemon
image: docker:18.01.0-dind
resources:
requests:
cpu: 20m
memory: 512Mi
securityContext:
privileged: true
volumeMounts:
- name: docker-graph-storage
mountPath: /var/lib/docker
- name: jenkins-home
mountPath: /var/jenkins_home
- name: docker-cmds
image: docker:18.01.0
command: ['docker', 'run', '-p', '80:80', 'httpd:latest']
resources:
requests:
cpu: 10m
memory: 256Mi
env:
- name: DOCKER_HOST
value: tcp://localhost:2375
- name: ml-services
env:
- name: DOCKER_HOST
value: tcp://localhost:2375
image: trion/jenkins-docker-client
ports:
- containerPort: 8080
volumeMounts:
- name: jenkins-home
mountPath: /var/jenkins_home
volumes:
- name: docker-graph-storage
emptyDir: {}
- name: jenkins-home
emptyDir: {}
我可能在上面的 .yaml 配置中包含了一些冗余配置,它使用 Jenkins 执行 Docker in Docker 容器并成功执行以下 Jenkinsfile:
pipeline {
agent {
docker {
image 'maven:3-alpine'
args '-v /root/.m2:/root/.m2'
}
}
stages {
stage('Build') {
steps {
sh 'mvn -B -DskipTests clean package'
}
}
}
}
【问题讨论】:
标签: docker jenkins kubernetes jenkins-pipeline