该定制化镜像的特点
- jenkins 版本为2.361 LTS 版本(可在制作镜像前就用新版本代替,也可在jekins管理界面,手动升级)
- 镜像中直接包含jdk,maven,node,gradle,node,pnpm且版本较新
- 全部已配置到环境变量,所以,可以不用在jenkins中配置maven,node,jdk,gradle,node
开始定制
Dockerfile
FROM ubuntu:focal
#修改国内源,清华大学的
RUN echo "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse" > /etc/apt/sources.list && \
echo "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse" >> /etc/apt/sources.list && \
echo "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse" >> /etc/apt/sources.list && \
echo "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-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 curl unzip git fontconfig && 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 -p jdk maven node gradle jenkins /root/data/.npm_global /root/data/.npm_caches /root/data/jenkins_workspace /root/data/.maven_store
#分别将gradle、jdk、node、jenkins.war、shell脚本放到刚才建好的目录中
#ADD与COPY的区别在于ADD会解压tar.gz、xz等linux下的压缩包,COPY仅是复制
ADD ./gradle-8.3.tar gradle/
ADD ./jdk-17_linux-x64_bin.tar.gz jdk/
ADD ./node-v20.11.1-linux-x64.tar node/
ADD ./apache-maven-3.9.4.tar maven/
COPY ./jenkins.war jenkins/
#启动容器中的Jenkins脚本,这个脚本后边给出
COPY ./docker-entrypoint.sh /
#设置容器运行时变量
ENV JAVA_HOME=/usr/local/jdk/jdk-17.0.10 \
MAVEN_HOME=/usr/local/maven/apache-maven-3.9.4 \
GRADLE_HOME=/usr/local/gradle/gradle-8.3 \
NODE_HOME=/usr/local/node/node-v20.11.1-linux-x64 \
NPM_CACHE_PATH=/root/data/.npm/.npm_caches \
NPM_GLOBAL_PATH=/root/data/.npm/.npm_global \
PNPM_CACHE_PATH=/root/data/.pnpm/.pnpm_cache \
PNPM_STORE_PATH=/root/data/.pnpm/.pnpm_store \
JENKINS_WAR_HOME=/usr/local/jenkins \
JENKINS_WORKSPACE=/root/data/jenkins_workspace \
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 build -t jekins:ubuntu-focal .
docker-entrypoint.sh
#!/bin/bash
#自定义Jenkins工程入口脚本
#@author panzy
#取/etc/profile最后一行的值,默认为fi,当其值变为export说明这是此容器非第一次启动,初始化操作可免
env_export=$(tail /etc/profile -n 1)
result=$(echo $env_export | grep "export")
if [[ "$result" == "" ]]
then
#gradle的zip压缩包用ADD复制也没有被解压……手动解压吧
echo "正在设置环境变量......"
#这里取了上边的环境变量值,写入到/etc/profile中,令配置全局生效
echo "export PATH=$JAVA_HOME/bin:$GRADLE_HOME/bin:$NODE_HOME/bin:$NPM_GLOBAL_PATH/bin:$PATH:${MAVEN_HOME}/bin" >> /etc/profile
#向 /root/.bashrc 追加脚本, 使得每次容器启动,都能刷新系统配置,使环境变量生效
echo "source /etc/profile" >> /root/.bashrc
source /etc/profile
#设置npm全局缓存目录
npm config set cache "$NPM_CACHE_PATH"
#设置npm全局安装目录,防止npm install -g 某软件 后无法直接执行
npm config set prefix "$NPM_GLOBAL_PATH"
#设置npm仓库镜像
npm config set registry https://registry.npmmirror.com
#全局安装pnpm
npm install -g pnpm@8.8
else
#非初次进入容器,需要手动刷新下环境变量,不然无效
source /etc/profile
fi
# 设置pnpm的存储相关路径
pnpm config set store-dir /root/data/.pnpm/.pnpm_cache
pnpm config set cache-dir /root/data/.pnpm/.pnpm_store
echo "正在启动jenkins......"
#直接启动jenkins,其实本来打算不输出日志的,用的nohup,但是吧,它直接就退出容器了……
java -DJENKINS_HOME=$JENKINS_WORKSPACE -jar $JENKINS_WAR_HOME/jenkins.war --httpPort=8008
docker-compose.yml
version : '3.9'
services:
jenkins:
user: root
restart: always
image: jekins:ubuntu-focal
container_name: jenkins
ports:
- 8008:8008
volumes:
- ./jenkins_workspace:/root/data/jenkins_workspace
- ./NPM:/root/data/.npm
- ./MAVEN_STORE:/root/data/.maven_store
- ./PNPM:/root/data/.pnpm
# 运行方式: docker-compose up -d
构建镜像
docker build -t jekins:ubuntu-focal .
完整镜像文件
4kyr
处理插件安装失败
在处理插件安装失败之前,请先看下一节,加快jenkins插件下载,再来处理插件安装失败
Docker 安装 Jenkins (保姆级教学——以及推荐插件安装不上问题解决)_jenkins推荐插件没装-CSDN博客
加快jenkins插件下载
在首次安装完毕之后,不要安装任何插件,然后进入jenkins,设置插件镜像,然后再安装插件
一般需要安装的插件如下
- git
- maven
- nodejs
- folder
- pipeline
- Pipeline: Stage View
- build user vars (用于在pipeline中获取执行job的用户信息)
Jenkins插件管理切换国内源地址_jenkins国内源-CSDN博客
jenkins插件镜像
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
jenkins占用内存优化
Jenkins 内存优化问题 - 掘金 (juejin.cn)
找回jenkins密码
Jenkins忘记密码解决方法 windows/Linux - 简书 (jianshu.com)
参考资料
linux中创建一次创建多个目录或创建多级目录_在该目录下新建两个子目录-CSDN博客
docker-compose up -d和docker-compose up --build的补充_docker compose up -d-CSDN博客