构建 docker 镜像

构建 docker 镜像主要基于 git project 和 branch (还有 timeout ),输出的是可运行镜像。


我们基于 git 事件自动打包,当 project 有新的 push 或者 merge 事件时自动触发,我司使用 Gerrit,监控 git 事件
很简单:

ssh -p 29418 -i key_path user@git.xxx.com "gerrit stream-events"

比如获取到了下面的事件:

{
"type": "ref-updated",
    "submitter": {
    "name": "Zhou xxx",
    "email": "zhouxxx@xxx.com",
    "username": "zhouxxx"
},
"refUpdate": {
    "oldRev": "f612a09551f848c22cc6b758ab6844c9afd73b00",
    "newRev": "c6f8b2214afcaa83d11a109703c31227e9ac4068",
    "refName": "master",
    "project": "projectName"
}
}

匹配需要的 type 然后拿到 project 和 refName。


构建的整体思路是创建一个 Container,在 Container 里构建镜像,构建镜像需要一些配置文件,我们定义了一个 dockerfiles 项目来专门存放配置文件,目录结构如下:

dockerfiles/{project1,project2…}/{service1,service2…}/{Dockerfile,build_app_image,build_app.sh,…}
  1. 对于一个 project,它有哪些 service 根据 dockerfiles/project/ 下面的目录名称来获取,当 project 有事件发生
    ,它下面所有的 service 都会构建(构建之前先 pull dockerfiles,保持 dockerfiles 最新);

  2. service 需要一个构建应用程序包的镜像,包含必要的基础环境,比如 centos6-java6-maven 包含 java 和 maven。

  3. 构建应用程序包镜像 在 build_app_image 中定义;

  4. build_app.sh 是具体构建应用程序包的命令,可以约定一个基础目录统一存放 project,以便 build_app.sh 知道进入哪个目录打包;

  5. Dockerfile 用于打真正运行的镜像,FROM 后面指定运行基础镜像,比如 centos6-java8-tomcat8,运行镜像的格式定
    义为 service:branch,比如 image-service:release_20151128。

  6. 我们用的 Docker 调度系统是 swarm,调用 swarm api 创建基于构建应用程序包镜像的服务,并且 Container command (entrypoint)中要写相关命令,包括:

1). 在约定的统一目录拉取项目代码,用:

git clone -b release/RB_2015_11_01 --depth=1 ssh://git.nosa.me:29418/projectName

2). 并且拉取 dockerfiles 配置:

git clone -b release/master --depth=1 ssh://git.nosa.me:29418/dockerfiles

3). 执行 build_app.sh 打包;

4). 构建运行镜像:

docker build --rm=true -t dockerRegistry/image-service:release_20151128 .

docker push dockerRegistry/image-service:release_20151128

这两个命令在 Dockefile 的目录运行,这里会使用 build_app.sh 打成的包,比如 COPY webapp.war /。

这些命令合起来就是完整的构建命令,举个例子:

cd / && git clone -b master –depth=1 ssh://autodeploy@git.nosa.me:29418/wdstack && \
cd / && git clone -b master –depth=1 ssh://autodeploy@git.nosa.me:29418/dockerfiles && \
cd //wdstack && sh //dockerfiles/services/wdstack/wdstack-service/build_app.sh && \
cd //dockerfiles/services/wdstack/wdstack-service && \
docker build –rm=true -t hub.internal.nosa.me/wdstack-service:master . && \
docker push hub.internal.nosa.me/wdstack-service:master