本文的原文连接是:
https://blog.csdn.net/freewebsys/article/details/79756488
1,关于jenkisn build docker
Jenkins 是一个代码编译构建工具,可以直接从 git 上面下载代码,然后进行编译。
构建。希望最后能打成一个docker镜像。
本来以为是个容易的事情,直接找了一个Jenkins 的镜像地址:
https://hub.docker.com/r/jenkinsci/jenkins/
但是发现,这个在h8s 的环境根本跑不了。
后来才知道,这个是因为docker 的文件系统上面不能再虚拟一个文件系统造成的。
我还研究半天,在jenkins docker 上面安装 安装docker ,是可以通过映射
-v /var/run/docker.sock:/var/run/docker.sock 和宿主公用一个docker的方式启动。
但是但是,在k8s 上面不行,就只能使用 dind 了,(docker in docker )
2,构建dind镜像
依赖官方的docker dind 镜像,整个构建过程:
Dockerfile:
FROM docker.io/docker:dind
#使用 ali 仓库地址
RUN echo -e "http://mirrors.aliyun.com/alpine/latest-stable/main\n\
http://mirrors.aliyun.com/alpine/latest-stable/community" > /etc/apk/repositories
#增加不安全链接地址,本地注册中心地址。
RUN mkdir -p /etc/docker && echo -e '{"insecure-registries": ["hub.local.ip:port"]}' > /etc/docker/daemon.json
RUN apk update && apk add tzdata vim openjdk8 libstdc++ curl ca-certificates bash && \
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
echo "Asia/Shanghai" > /etc/timezone && \
rm -rf /root/.cache
#设置环境变量
ENV JAVA_HOME /usr/lib/jvm/default-jvm
ENV PATH $PATH:$JAVA_HOME/jre/bin:$JAVA_HOME/bin
#安装字体 Jenkins 需要,git,ssh,修改root主目录
RUN apk update && apk add ttf-dejavu git openssh && \
sed -i -e 's/root:\/root/root:\/var\/jenkins_home/g' /etc/passwd
#设置jenkins 主目录
ENV JENKINS_HOME /var/jenkins_home
#设置maven目录
ENV MAVEN_HOME /var/jenkins_home/tools/maven3
ENV PATH $PATH:$MAVEN_HOME/bin
WORKDIR /var/jenkins_home
#添加启动脚本和 war 文件从Jenkins 下载。
ADD jenkins_run.sh /jenkins_run.sh
ADD jenkins.war /usr/share/jenkins/jenkins.war
EXPOSE 8080
ENTRYPOINT ["/jenkins_run.sh"]
其中jenkins_run.sh 脚本:
#!/bin/sh
nohup java -Duser.home=/var/jenkins_home -jar /usr/share/jenkins/jenkins.war --httpPort=8080 >> /var/log/jenkins.log &
sh /usr/local/bin/dind dockerd --host=unix:///var/run/docker.sock --host=tcp://0.0.0.0:2375
使用 nohup 把jenkins 启动,这个不需要 tomcat也可以跑起来的 war 文件。里面自带jetty了。
然后是dind 启动。
构建好镜像之后就可以启动了。
docker build . -t myhub/jenkins:latest
3,启动
docker run –privileged -v /jenkins-data:/var/jenkins_home -d -p 8080:8080myhub/jenkins:latest
加上一个 privileged 特殊参数,使用docker的 以特殊模式运行。
然后进去之后就可以使用docker ps 查看了。
其中 kubernetes 里面也要进行配置,是支持 dind 模式的。
这样整个流程就好了。
需要映射 /var/jenkins_home目录,所有的配置,安装的插件都在这个目录。
这个目录需要持久化。
其中密码在:
cat /var/jenkins_home/secrets/initialAdminPassword
忘记了上去看看。
dind 的镜像里面的配置文件:
/etc/docker/daemon.json
主要增加本地非http的注册中心的。
4,总结
这个地方有两个地方偷懒了。第一没有使用Jenkins 用户构建。
安全上会有点问题。
第二,这个没有使用 slave 的方式去跑一个job。对于有几个项目的工程来说,其实问题不大,构建也费不了多少时间。
要是编译java 还需要安装 maven,通过界面点击下就好了。
jenkins 非常的好用。剩下的事情就熟悉多了。
公司内部使用足够了。
这样 git 使用 gogs ,构建使用 jenkins dind ,运行使用 k8s。
完美的企业内部解决方案。
本文的原文连接是:
https://blog.csdn.net/freewebsys/article/details/79756488