docker镜像用的jenkinsci/blueocean,用原始的jenkins下的也可以。
注意:最终方发有修改,写在了最后!
问题1
在运行docker命令时,如docker version
,会提示cannot connect to docker daemon
的错误。
原因
jenkins使用的是宿主机的docker环境,本身不运行docker daemon。
解决方式
所以需要挂在宿主机的docker.sock
文件。即在启动时增加挂载:
"/var/run/docker.sock:/var/run/docker.sock"
虽然windows下在宿主机上看不到/var/run/docker.sock
文件,但实际上docker for windows是会跑一个Hyper-V虚拟的Linux环境并运行docker daemon的,在启动docker镜像时,docker container可以挂载到虚拟机的docker socket文件。
这个方法来自这篇文章:连接
新的问题
这样挂载以后,重新exec到宿主机上执行docker version
,不再提示上一个错误了,但是会提示权限不够。
查看/var/run/docker.sock
文件,会发现所有者和组都是root
,其他用户不允许独写。
而blueocean镜像,jenkins是以jenkins
用户运行的,所以无法访问。
解决方式
以root身份登入
docker exec -it -u root [container-id] sh
修改socket文件权限,这里修改所有组给jenkins
chgrp jenkins /var/run/docker.sock
然后就可以了。
其他
这里在权限问题时,想切换root用户那里卡了很久。原因是一开始一直在用docker exe
而不是docker exec
。。。而docker给我的提示是不认识-u
选项,而不是不认识exe
命令。。。
后记
在看jenkins文档是,偶然发现有dind`这个组件,可以支持在docker中运行docker,也就是在jenkins的docker中跑docker。
不过又看到了dind
作者的这篇文章,如果只是为了CI使用的话,作者其实也是推荐通过bind mount docker的socket文件来实现docker中跑docker命令的。因为dind是为了docker开发使用的。
补充-0602
由于blueocean镜像的一些问题,最终还是切换回原始镜像打包了,原始镜像的Dockerfile和docker-compose配置如下:
# Dockerfile
FROM jenkins/jenkins:lts
# 直接用root,避免很多问题
USER root
# 原始镜像没有docker,这里重新下载
RUN rm -f /etc/localtime
&& ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
&& apt-get update
&& curl -sSL https://get.docker.com/ | sh
# 原始镜像没有maven,我这里挂的外部下载好的
ENV MAVEN_HOME=/var/maven
ENV PATH $PATH:$MAVEN_HOME/bin
# docker-compose
jenkins:
# my-jenkins是我打包的jenkins镜像
image: my-jenkins
volumes:
- "d:/docker/jenkins:/var/jenkins_home"
- "/var/run/docker.sock:/var/run/docker.sock"
- "d:/docker/jenkins_maven:/var/maven"
ports:
- "8080:8080"
- "50000:50000"
environment:
- "TZ=Asia/Shanghai"
deploy:
replicas: 1
restart_policy:
condition: on-failure
networks:
- jenkins
restart: always