封尘网

让学习成为一种习惯!

制作属于自己的Jenkins slave镜像

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的方式,JNLPssh方式,个人觉得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
    

     

 

提醒:本文最后更新于 1089 天前,文中所描述的信息可能已发生改变,请谨慎使用。