本文包含以下内容:
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
这里使用了上面提供的 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
到 Jenkins 容器,所以宿主机能访问 Jenkins 下载和构建的内容理解这个运行机制后,就能根据自己的需要进行各种定制了。