构建一个属于自己的Jenkins镜像
本文目标
不使用Jenkins官方提供的镜像,从最简系统镜像搭建一个最新稳定版的Jenkins镜像,自定义镜像内有的工具如jdk、gradle、node等,使用Dockfile与Shell脚本搭建而成
自定义的原因是官方镜像不能满足我们对于镜像内部工具的需求
本文面向
面向对象😄 ——本文面向有定制Jenkins镜像需求的小白兔,大神请轻喷~
环境说明
操作系统:Centos 7
Docker版本:19.03.5
镜像内部依赖说明
基础系统镜像:ubuntu:bionic
, 也就是18.04 LTS
Gradle: gradle-6.0.1
JDK: jdk1.8.0_221
Node: node-v11.4.0
Jenkins: 最新stable war
Dockerfile:构建镜像的蓝图
FROM ubuntu:bionic #基础镜像 #修改国内源,清华大学的 RUN echo "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse" > /etc/apt/sources.list && \ echo "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse" >> /etc/apt/sources.list && \ echo "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse" >> /etc/apt/sources.list && \ echo "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse" >> /etc/apt/sources.list #安装apt工具、vim、git、curl、unzip等常用工具,并添加中文语言包 RUN apt-get update && apt-get install -y apt-utils; \ apt-get install -y vim git curl unzip && apt-get auto-clean; \ apt-get install -y language-pack-zh-hans language-pack-zh-hans-base #工作目录设置,相当于设置相对路径,没以/开头的路径都在/usr/local下 WORKDIR /usr/local #创建jdk node gradle jenkins的war目录,以及npm全局安装位置与缓存 RUN mkdir jdk node gradle jenkins /root/.npm_global /root/.npm_caches #分别将gradle、jdk、node、jenkins.war、shell脚本放到刚才建好的目录中 #ADD与COPY的区别在于ADD会解压tar.gz、xz等linux下的压缩包,COPY仅是复制 ADD ./gradle-6.0.1-bin.zip gradle/ ADD ./jdk-8u221-linux-x64.tar.gz jdk/ ADD ./node-v11.4.0-linux-x64.tar.gz node/ COPY ./jenkins.war jenkins/ #启动容器中的Jenkins脚本,这个脚本后边给出 COPY ./docker-entrypoint.sh / #设置容器运行时变量 ENV JAVA_HOME=/usr/local/jdk/jdk1.8.0_221 \ GRADLE_HOME=/usr/local/gradle/gradle-6.0.1 \ NODE_HOME=/usr/local/node/node-v11.4.0-linux-x64 \ NPM_CACHE_PATH=/root/.npm_caches \ NPM_GLOBAL_PATH=/root/.npm_global \ JENKINS_WAR_HOME=/usr/local/jenkins \ JENKINS_WORKSPACE=/var/lib/jenkins \ TZ=Asia/Shanghai \ LANG=zh_CN.UTF-8 \ LANGUAGE=zh_CN:zh:en_US:en \ LC_ALL=zh_CN.UTF-8 #暴露端口 EXPOSE 8008 #容器入口,执行上边复制到/的脚本 ENTRYPOINT [ "/bin/bash", "/docker-entrypoint.sh" ]
docker-entrypoint.sh :启动时必经的风景
#!/bin/bash #自定义Jenkins工程入口脚本 #@author hellxz #取/etc/profile最后一行的值,默认为fi,当其值变为export说明这是此容器非第一次启动,初始化操作可免 env_export=$(tail /etc/profile -n 1) result=$(echo $env_export | grep "export") if [[ "$result" == "" ]] then #gradle的zip压缩包用ADD复制也没有被解压……手动解压吧 echo "解压gradle" unzip -oq /usr/local/gradle/*.zip -d /usr/local/gradle/ rm -f /usr/local/gradle/*.zip echo "正在设置环境变量......" #这里取了上边的环境变量值,写入到/etc/profile中,令配置全局生效 echo "export PATH=$JAVA_HOME/bin:$GRADLE_HOME/bin:$NODE_HOME/bin:$NPM_GLOBAL_PATH/bin:$PATH" >> /etc/profile #刷新系统配置,使环境变量生效 source /etc/profile #设置npm全局缓存目录 npm config set cache "$NPM_CACHE_PATH" #设置npm全局安装目录,防止npm install -g 某软件 后无法直接执行 npm config set prefix "$NPM_GLOBAL_PATH" else #非初次进入容器,需要手动刷新下环境变量,不然无效 source /etc/profile fi echo "正在启动jenkins......" #直接启动jenkins,其实本来打算不输出日志的,用的nohup,但是吧,它直接就退出容器了…… java -DJENKINS_HOME=$JENKINS_WORKSPACE -jar $JENKINS_WAR_HOME/jenkins.war --httpPort=8008
最后
写得比较粗糙,如果你有更好的写法,欢迎评论交流
**本文禁止转载,本文地址
https://www.cnblogs.com/hellxz/p/custom_self_needed_jenkins.html **
本文作者:东北小狐狸
本文链接:https://www.cnblogs.com/hellxz/p/custom_self_needed_jenkins.html
版权声明:本作品采用自由转载-非商用-非衍生-保持署名 (CC BY-NC-ND 3.0)许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步