本文包含以下内容:
Jenkins 官方文档:
https://github.com/jenkinsci/docker/blob/master/README.md
其他相关文档:
https://jenkins.io/zh/doc/book/installing/
修改时区参考:
https://blog.csdn.net/isea533/article/details/87261764使用默认镜像登陆后显示的时间为默认0时区的,可以通过下面方式简单修改,创建一个新的 Dockerfile,内容如下:
FROM jenkins/jenkins:lts USER root RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/Shanghai" > /etc/timezone ARG user=jenkins USER ${user}
根据当前文件创建一个新的镜像即可。
更多配置时区方法看这里: https://blog.csdn.net/isea533/article/details/87261764
在宿主机创建一个 /var/jenkins_home
,jenkins 所有信息都放在这里,当挂载该目录时,以后可以方便的升级 jenkins 镜像,不影响所有任务、配置、插件等信息。
创建目录后,配置权限 chmod 777 /var/jenkins_home
。
docker run -d -p 9999:8080 / -p 50000:50000 / --restart=always / --name jenkins / -v /var/jenkins_home:/var/jenkins_home / jenkins/jenkins:lts
最后的镜像名 jenkins/jenkins:lts
可以换成上面修改时区后的镜像。
参考:
https://segmentfault.com/a/1190000012921606
https://hyjk2000.github.io/2012/03/16/how-to-set-up-ssh-keys/ 在 Jenkins 中安装 Publish over SSH
插件,然后进入 jenkins 容器:
docker exec -it jenkins /bin/bash
进入后,执行下面命令创建 ssh 密钥:
# 创建目录 mkdir ~/.ssh && cd ~/.ssh # 生成密钥 ssh-keygen -t rsa # 一直回车即可 # 生成私钥id_rsa,公钥id_rsa.pub # 退出镜像 exit
在 jenkins 镜像中, ~
home 目录就是 /var/jenkins_home
,所以 .ssh
文件也在宿主机上。
Jenkins Dockerfile 部分代码如下
RUN groupadd -g ${gid} ${group} / && useradd -d "$JENKINS_HOME" -u ${uid} -g ${gid} -m -s /bin/bash ${user}
-d
指定了用户的 home
目录
下面开始在【宿主机】上继续操作,进入挂载的 /var/jenkins_home/.ssh
目录,执行下面的操作:
# 在宿主机创建 .ssh 目录 mkdir ~/.ssh # 将 jenkins 镜像的公钥追加到 authorized_keys 后面 cat id_rsa.pub >> ~/.ssh/authorized_keys
接下来还要配置 sshd
服务,按下面进行操作:
vi /etc/ssh/sshd_config
编辑 sshd_config 的配置
# 启用下面的配置 RSAAuthentication yes PubkeyAuthentication yes # 请留意 root 用户能否通过 SSH 登录 PermitRootLogin yes
重启 SSH 服务:
service sshd restart
在 Jenkins 中点击【系统管理】->【系统设置】,找到 Publish over SSH
插件,配置如下:
填写说明:
配置完保存,点击【Test Configuration】测试能否登陆。
Git 示例: https://gitee.com/free/docker-test
在 Jenkins 新建一个项目,然后配置如下:
这里使用了上面提供的 Git 地址。
选择 Send files or execute commands over SSH after the build runs ,配置如下:
这里就是选择了宿主机,然后配置了一个命令,这个命令是我们重点看的,命令如下:
cd /var/jenkins_home/workspace/DockerTest && docker build -t dockertest .
Jenkins 会通过 Git 下载项目,会下载到 /var/jenkins_home/workspace/
目录,Jenkins 镜像通过 ssh 登陆到宿主机时,可以直接访问到镜像中的该目录,所以能在宿主机执行该命令。
上面的命令就是进入 DockerTest
目录,执行构建镜像。
做好上面配置后,立即构建:
输出的日志:
Started by user NetStar Building in workspace /var/jenkins_home/workspace/DockerTest No credentials specified > git rev-parse --is-inside-work-tree # timeout=10 Fetching changes from the remote Git repository > git config remote.origin.url https://gitee.com/free/docker-test # timeout=10 Fetching upstream changes from https://gitee.com/free/docker-test > git --version # timeout=10 > git fetch --tags --progress https://gitee.com/free/docker-test +refs/heads/*:refs/remotes/origin/* > git rev-parse refs/remotes/origin/master^{commit} # timeout=10 > git rev-parse refs/remotes/origin/origin/master^{commit} # timeout=10 Checking out Revision 984f8a72be7d51f5f6586248e1734f5f8394b0cf (refs/remotes/origin/master) > git config core.sparsecheckout # timeout=10 > git checkout -f 984f8a72be7d51f5f6586248e1734f5f8394b0cf Commit message: "test" > git rev-list --no-walk 984f8a72be7d51f5f6586248e1734f5f8394b0cf # timeout=10 SSH: Connecting from host [27e4fe10d3b8] SSH: Connecting with configuration [k8s-master] ... SSH: EXEC: STDOUT/STDERR from command [cd /var/jenkins_home/workspace/DockerTest && docker build -t dockertest .] ... Sending build context to Docker daemon 53.76kB Step 1/3 : FROM alpine:3.9 ---> caf27325b298 Step 2/3 : RUN apk add tzdata && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/Shanghai" > /etc/timezone && apk del tzdata ---> Using cache ---> 5508719ca922 Step 3/3 : CMD ["/bin/sh"] ---> Using cache ---> a8a23bfcceef Successfully built a8a23bfcceef Successfully tagged dockertest:latest SSH: EXEC: completed after 200 ms SSH: Disconnecting configuration [k8s-master] ... SSH: Transferred 0 file(s) Finished: SUCCESS
构建成功后,通过 docker images
查看镜像:
dockertest latest a8a23bfcceef 1 minutes ago 6.86MB
所有的配置中,关键的地方在:
/var/jenkins_home
理解这个运行机制后,就能根据自己的需要进行各种定制了。