在kubernetes
中准备搭建一个jenkins
的多节点环境,默认的master节点直接使用了jenkins官方的镜像即可。但是对于slave镜像的话,网上也有很多,有些是使用JNLP方式实现连接的,有些是使用ssh方式。但是使用ssh方式连接的镜像很多都是自己制作的,因为里面会配置一个root的密码用来连接容器。所以为了自己方便,所以制作者一个属于自己的镜像是很重要的。
系统环境
系统: CentOS Linux release 7.2.1511 (Core)
docker-ce: 19.03.5
制作基础镜像
本次镜像使用centos7的系统光盘实现。
挂载
centos7
光盘到系统中mount /dev/sr0 /mnt/
创建一个目录用来保存文件
mkdir -p /data/centos7 export centos_root=/data/centos7
添加一个repo文件到
/etc/yum.repos.d/local.repo
最好把
/etc/yum.repos.d
目录下的文件移到/tmp目录下,然后再添加以下文件cat >/etc/yum.repos.d/local.repo<<-EOF [local] name=local_mnt baseurl="file:///mnt" enabled=1 gpgchjeck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 EOF
安装所需要的工具(这就是基础镜像)
yum -y --installroot=${centos_root} install bash coreutils findutils procps iputils iproute curl openssh-clients openssh-server vim wget git
把
/data/centos7
打包成一个centos7-base
镜像[root@localhost centos7]# du -sh /data/centos7/ 488M /data/centos7/ //执行以下命令打包成镜像 tar -C ${centos_root} -c . | docker import - centos7-base
由于上面制作的基础镜像中并没在启动ssh服务,所以需要通过Dockerfile方式重新打包成一个新的镜像
cat >Dockerfile<<-EOF FROM centos7-base MAINTAINER Swper <service@58jb.com> ADD jdk1.8.0_121 /usr/local/java ADD apache-maven-3.6.3 /usr/local/maven RUN ln -s /usr/local/java/bin/java /usr/bin/java && \ ln -s /usr/local/maven/bin/mvn /usr/bin/mvn && \ ssh-keygen -f /etc/ssh/ssh_host_rsa_key -N '' -t rsa && \ ssh-keygen -f /etc/ssh/ssh_host_ed25519_key -N '' -t ed25519 && \ echo 'root:你的密码' | chpasswd && \ echo 'export JAVA_HOME=/usr/local/java' >>/etc/profile && \ useradd -m -d /home/jenkins -s /bin/bash jenkins && \ mkdir -p /home/jenkins/.jenkins && \ chmod -R 777 /home/jenkins ENV JAVA_HOME /usr/local/java ENV MAVEN_HOME /usr/local/maven ENV PATH $JAVA_HOME/bin:$MAVEN_HOME/bin:$PATH EXPOSE 22/tcp CMD ["/usr/sbin/sshd", "-D"] WORKDIR /home/jenkins EOF
执行
build
命令docker build -t jenkins-slave . -f Dockerfile
配置说明
上面的配置文件中定义的ADD加入的两个目录必须跟
Dockerfile
在同一目录下为了解决环境变量问题,做了一个软连接,同时使用
ENV
定义环境变量由于上面的
ENV
参数在容器里出现了,mvn
执行时无法发现JAVA_HOME
所以把变量加入到/etc/profile文件中配置文件中加入了
root
的密码,此帐号是ssh
登陆到容器使用的创建
/home/jenkins
并授权足够的权限,因为git拉代码和build 都需要写入权限实际使用中发现,上面配置中添加
jenkins
用户这行可以省,因为容器启动时以root方式启动的需要暴露22端口,并指定一个工作目录。
jenkins slave
镜像其实就是一个支持java
环境,和打包工具maven
或者gradle
的基础镜像。Jenkins有两种添加slave
的方式,JNLP
和ssh
方式,个人觉得ssh
方式更加方便,易扩展。如果使用
openjdk
的话可以把镜像大小再做进一步的优化
如果拉取了别人的jenkins slave
镜像后不知道它配置的密码怎么办?
通过以下方式查看build镜像时的命令
1、定义一个变量(当然你以可以不定义) DockerImage=你拉取下来的镜像名 2、执行以下命令(如果它在dockerfile中定义修改root密码的话就可以看到了) docker history --format {{.CreatedBy}} --no-trunc=true $DockerImage |sed "s/\/bin\/sh\ -c\ \#(nop)\ //g"|sed "s/\/bin\/sh\ -c/RUN/g" | tac