本文包含以下内容:

  1. 配置 Jenkins 镜像时区,使用国内的时区
  2. 配置宿主机挂载目录
  3. 创建启动脚本
  4. Jenkins 配置 Publish over SSH,允许 ssh 登陆宿主机
  5. Jenkins 构建镜像

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 可以换成上面修改时区后的镜像。

配置 SSH

参考:
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

配置 Publish over SSH

在 Jenkins 中点击【系统管理】->【系统设置】,找到 Publish over SSH 插件,配置如下:
在这里插入图片描述

填写说明:

  • Passphrase 是创建 ssh 密钥时输入的密码,如果你按照前面一直回车,就是空,不需要输入,上图显示的内容是保存后自动出现的,不需要管。
  • Key 部分要输入上面生成的私钥内容
  • Name 给配置起一个主机名,自己能识别即可
  • Hostname 配置主机地址
  • Username 登陆的用户

配置完保存,点击【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

关键点

所有的配置中,关键的地方在:

  1. Jenkins 在容器中执行,容器中没有 docker 服务,不能构建镜像
  2. 宿主机映射了/var/jenkins_home 到 Jenkins 容器,所以宿主机能访问 Jenkins 下载和构建的内容
  3. Jenkins 通过 ssh 登陆到宿主机后,就能用宿主机的所有工具、命令、环境等等

理解这个运行机制后,就能根据自己的需要进行各种定制了。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐