Inside Kolla - 05 从 tools 目录开始
从 tools 目录开始
在上一篇中已介绍了 Kolla 的源代码目录结构和各个目录中源代码的基本作用,现在开始深入到各个目录,介绍目录中的具体内容。每个人分析代码的思路和方法不同,会选择从不同的目录开始。在这里,我选择从 tools
目录开始,从高层了解 Kolla 组件间的关系、编译依赖,命令行工具等,然后再次按照依赖来逐个组件分析。
tools
目录的文件树如下:
.
├── build-all-docker-images
├── build-docker-image
├── cleanup-containers
├── cleanup-images
├── genenv
├── init-runonce
├── kolla
├── pre-commit-hook
├── update-build-links
├── validate-all-json.sh
├── validate-all-maintainer.sh
├── validate-all-yaml.sh
├── validate-json.py
├── validate-maintainer.sh
└── validate-yaml.py
这些文件都是脚本文件,核心的文件为:build-* genenv kolla 。(这里使用了 vi 来查看,并使用了 set nu,因此会带上行号,使用一些支持列模式的编辑器可很简单地去掉行号;因为文件版本不同的话,内容和行号不相同,仅供参考)
build-* 脚本
build-* 负责处理 Dockerfile ,编译 doker 镜像。有两个 Shell 脚本文件:
build-docker-image
编译一个组件的 docker 镜像。这个脚本的用法可使用
build-docker-image -h
查看。这里涉及了一点隐含的 Shell 技巧。 Kolla 中各个 docker 镜像定义的目录中,都有一个 build 文件用来编译当前的 docker 镜像。这些 build 文件其实都是一个链接,指向
build-docker-image
脚本。当调用 build 文件,会把 build 文件路径作为$0
参数,所以build-docker-image
脚本的IMGDIR
变量为指向 build 文件所在的镜像目录(即 docker 镜像定义目录,通过dirname $0
获得),因此build-docker-image
脚本可以编译当前 docker 镜像。脚本中首先定义了一系列编译使用到的变量,并设置了默认值,改变这些值时应参考默认值:
3 TOPDIR=$(git rev-parse --show-toplevel)
4 IMGDIR="$(cd "$(dirname "$0")" && pwd)"
5
6 RELEASE_NAMESPACE=kollaglue
7 NAMESPACE=kollaglue
8 PREFIX=centos-rdo-
9 TAG=$(git rev-parse --short HEAD)
10 RELEASE_TAG=kilo
然后,定义了一个 usage 函数,用来打印帮助内容(略)。
然后,在正式执行前,先检查是否有编译配置文件,如果有,执行这些文件:
29 [ -f $TOPDIR/.buildconf ] && . $TOPDIR/.buildconf
30 [ -f $IMGDIR/.buildconf ] && . $IMGDIR/.buildconf
然后,会有一段常规的命令后参数处理脚本,读取参数并转换(略)。然后,根据参数,对镜像命名
97 IMAGE="${PREFIX}${IMGDIR##*/}"
98 FULLIMAGE="${NAMESPACE}/${IMAGE}${TAG:+:${TAG}}"
IMAGE
是镜像的名字,用编译时前缀PREFIX
和镜像在的目录IMGDIR
(只保留路径中最后一个'/'后的部分)来命名,如centos-rdo-keystone
。FULLIMAGE
是镜像的全名,是在 docker-registry 中的名字,并当TAG
变量不为空时,在IMAGE
后面加上一个版本标签,如kollaglue/centos-rdo-keystone:kilo
。然后,创建编译时的临时目录,把镜像目录内容拷贝到临时目录,使用 sed 修改掉 Dockerfile 中定义的
%%KOLLA_NAMESPACE%%
%%KOLLA_PREFIX%%
%%KOLLA_TAG%%
等值,然后使用docker build
编译。由于所有的编译使用同一个TEMPDIR
,因此不能同时编译多个 docker 镜像!112 TMPDIR=$(mktemp -d /tmp/kolla-build.XXXXXXXXXX)
113 cp -aL $IMGDIR/* $TMPDIR
114 # Use an extension for in-place editing for portability, as GNU and BSD
115 # versions of sed behave differently otherwise
116 sed -i.bak "s/%%KOLLA_NAMESPACE%%/${NAMESPACE}/g" $TMPDIR/Dockerfile
117 sed -i.bak "s/%%KOLLA_PREFIX%%/${PREFIX}/g" $TMPDIR/Dockerfile
118 sed -i.bak "s/%%KOLLA_TAG%%/${PARENT_TAG}/g" $TMPDIR/Dockerfile
119
120 if ! docker build ${BUILDFLAGS} -t "$FULLIMAGE" $TMPDIR; then
121 echo "ERROR: failed to build $FULLIMAGE"
122 exit 1
123 fi
124 rm -rf $TMPDIR
最后,如果使用了push选项,会把镜像push到docker仓库,此时使用到
FULLIMAGE
变量。128 if [ "$PUSH" = 1 ]; then
129 if ! docker push "$FULLIMAGE"; then
130 echo "ERROR: failed to push $FULLIMAGE"
131 exit 1
132 fi
133
134 echo "Pushed: $FULLIMAGE"
135 fi
build-all-docker-images
编译所有组件的 docker 镜像。这个脚本的用法通过
build-all-docker-image -h
获得。这个脚本是对
build-docker-image
的进一步封装,从而能支持一次性编译所有的 docker 镜像。需要注意的是,这个脚本注明了要使用 bash 4 和 gawk。由于部分的 Linux distribution 里面没有包含这些软件,需要自己安装(里面只用了一句 gawk 啊!!!不明白为什么不直接用awk,或者用which检查哪个awk兼容软件可用)。1 #!/usr/bin/env bash
2 # Depends on bash 4 and gawk
在 Ubuntu 14.04 Desktop里面,就缺少了 gawk,通过apt安装:
sudo apt-get install -y --force-yes gawk
首先,定义了3个用于变量的目录变量。
TOPDIR
是 Kolla 根目录,这里用了 git 来进行判断,也可通过 dirname 来获取;WORKDIR
是编译时的临时目录;DOCKERDIR
是编译所有 docker 镜像的临时目录。Kolla 根目录的所有内容 copy 到WORKDIR
中。4 TOPDIR=$(git rev-parse --show-toplevel)
5 # Work in a temp dir so that developers can continue working while a build is
6 # in progress
7 WORKDIR=$(mktemp -d /tmp/kolla-workdir.XXXXXXXXXX)
8 # Remove $WORKDIR otherwise $TOPDIR is copied *inside* of it
9 rm -rf $WORKDIR
10 cp -aL "$TOPDIR" $WORKDIR
11 DOCKERDIR="$WORKDIR/docker"
然后,定义了3个数组变量。
dependency
保存了各个 docker 镜像依赖关系;img_dirs
保存 docker 镜像的目录;status
保存 docker 镜像的编译状态。13 declare -A dependency
14 declare -A img_dirs
15 declare -A status
然后,是一系列函数的定义:
info
打印普通信息success
打印成功信息warn
打印警告set_defaults
设置PREFIX
和NAMESPACE
等参数默认值has_changed
通过 git 检查是否有文件的改变。参数为image
,所在的目录为${img_dirs[$image]#$WORKDIR/}
通过 git diff 检查是否有改变。requires_build
检查镜像是否需要进行编译build_image
编译镜像。调用镜像目录中的 build 脚本(即build-docker-image
脚本),进行编译。init_image
初始化镜像编译配置。调用set_defaults
,运行镜像目录的buildconf
文件,通过gawk
检查镜像所依赖的镜像(就是这个地方使用了 gawk ),并处理镜像的名字69 function init_image {
70 local img_dir=$1
71
72 set_defaults
73 [ -f $WORKDIR/.buildconf ] && . $WORKDIR/.buildconf
74 [ -f $img_dir/.buildconf ] && . $img_dir/.buildconf
75 [ -n "$FORCE_NAMESPACE" ] && NAMESPACE=$FORCE_NAMESPACE
76
77 local image="${NAMESPACE:+${NAMESPACE}/}${PREFIX}${img_dir##*/}"
78 local base_image=$(cat $img_dir/Dockerfile | gawk 'match($0, /^\s*FROM\s+(\S+)/, matches) {print matches[1]}' )
79 base_image=${base_image//%%KOLLA_NAMESPACE%%/$NAMESPACE}
80 base_image=${base_image//%%KOLLA_PREFIX%%/$PREFIX}
81 base_image=${base_image//:%%KOLLA_TAG%%/}
82
83 img_dirs[$image]=$img_dir
84 dependency[$image]=$base_image
85
86 # Restore defaults to minimize risk of side effects
87 set_defaults
88 }
79-81行替换掉
%%KOLLA_NAMESPACE%%
%%KOLLA_PREFIX%%
:%%KOLLA_TAG%%
等标记,然后记录到数组img_dirs
和dependency
里面。process_image
处理镜像。函数先根据${dependency[$image]}
递归地调用process-image
处理其基础镜像,然后调用requires_build
检查$image
是否需要重新编译,需要编译时用build-image
进行编译,最后更新status
中的状态为up-to-date
print_summary
打印编译总结。把status
中的状态信息打印出来。interrupted
中断处理函数。在中断编译时,会删除$WORKDIR
。usage
和参数处理
显示帮助信息,处理脚本运行参数。其它
处理逻辑。找到$DOCKERDIR
里面的所有 Dockerfile,然后执行init_image
初始化编译配置,然后使用process_image
处理镜像编译。175 # Do a first pass to find images to build and their dependencies
176 for dockerfile in $(find $DOCKERDIR -name Dockerfile); do
177 init_image $(dirname $dockerfile)
178 done
179
180 # Process all images
181 for image in "${!img_dirs[@]}"; do
182 process_image $image
183 done
184
185 print_summary
186 rm -rf $WORKDIR
genenv
生成 Kolla 所需要的环境变量。
genenv 最终生成 2 个环境变量文件 ./openrc
和 ./compose/openstack.env
。
openrc
OpenStack的访问文件,用于各种 client 访问 OpenStack API。
128 export OS_AUTH_URL="http://${KEYSTONE_PUBLIC_SERVICE_HOST}:5000/v2.0"
129 export OS_USERNAME=$ADMIN_TENANT_NAME
130 export OS_PASSWORD=$ADMIN_USER_PASSWORD
131 export OS_TENANT_NAME=$ADMIN_TENANT_NAME
openstack.env
Kolla 所有 docker 镜像在启动时需要的配置文件。从镜像启动一个容器时,需要读取这个文件的内容,并初始化各个服务(在编译镜像时,各种 OpenStack 服务还没有配置,只是安装在镜像中而已)。
kolla
Kolla 辅助工具脚本。这个脚本可通过 kolla -h
查询用法。
脚本里面定义了一系列的函数:
process
通过
docker-compose
启动 docker 容器。process_all
启动一整个OpenStack所需要的容器,单个容器通过
process
启动check_selinux
检查 selinux 状态
pre_start
调用 check_selinux,并 source openrc,如果 openrc 文件不存在,那么需要通过 genenv 生成
post_start
等待 OpenStack 服务启动完毕
usage
帮助函数
使用这个脚本可启动一个测试环境。
其它脚本
cleanup-*
清理环境
init-runonce
初始化 OpenStack 配置,下载镜像、增加安全组、建立初始网络、更新配额设置等
pre-commit-hook
Git 提交前的钩子脚本,会调用 validate*
脚本进行处理
update-build-links
更新 docker 镜像定义目录的 build 文件链接
validate*
检查各个文件是否有效
Inside Kolla - 05 从 tools 目录开始的更多相关文章
- Inside Kolla - 01 简介
简介 在 opencloud 2015 的会议上初次了解到 kolla 项目后,开始去了解和学习 kolla 的源代码和相关的知识.经过一段时间的了解,觉得 kolla 确实是一个很好的项目,它使用预 ...
- 关于AndroidSDK配置时的tools目录下找不到adb.exe的错误
欢迎关注公众号,每天推送Android技术文章,二维码如下:(可扫描) 在配置android SDK的时候,有时会发现在android-sdk-windows\tools目录下并没有adb.exe,这 ...
- Inside Kolla - 04 Kolla 目录结构
Kolla 目录结构 把 Kolla 的源代码下载下来后,先从总体上分析 Kolla 的目录结构,查看顶层目录结构,使用 tree -L 1 输出 . ├── ansible ├── compose ...
- Inside Kolla - 03 下载Kolla
下载 Kolla Kolla 目前托管在 github.com 上,项目仓库的 URL 是 https://github.com/stackforge/kolla. 下载 Kolla 时,可下载 gi ...
- Inside Kolla - 02 Kolla 是什么
Kolla 是什么? Kolla 项目 Kolla 是 OpenStack 里面的一个项目,在源代码的 README.md 里面的解析是: The Kolla project is part of t ...
- Mego(05) - Mego Tools使用教程
前言 使用过EntityFramework6的朋友应该都知道EF中的PowerTools这个工具可以帮助初学者或者开发人员快速构建一个EF的数据上下文,并且可以很直观的看到实体之间的关系.不过目前升级 ...
- Linux学习笔记05—文件与目录权限
1. 绝对路径与相对路径绝对路径:路径的写法一定由根目录 ‘/’写起,例如 /usr/local/mysql 这就是绝对路径相对路径:路径的写法不是由根目录 ‘/’写起,例如:首先用户进入到/, 然后 ...
- Android SDK中 tools 目录下的工具介绍
Android SDK包含了各种各样的定制工具,简介如下: Android模拟器(Android Emulator )它是在你的计算机上运行的一个虚拟移动设备.你可以使用模拟器来在一个实际的Andro ...
- kolla base目录下Dockerfile.j2分析
这几天在研究kolla制作镜像的流程,记录下对kolla项目中base目录Dockerfile.j2阅读过程.本质上base目录下的Dockerfile.j2文件,对是yum 源的一些配置,从而使制作 ...
随机推荐
- 利用onekeyup即可实现验证码的点击刷新功能
显示验证码 首先在Home/Controller下创建一个公共控制器PublicController 1 <php2 namespace Home\Controller;3 4 use Thin ...
- hello world 驱动程序编写
操作系统课程设计选题 驱动程序的编写和安装. 经过一天多的努力,终于把我的第一个驱动程序模块成功编写并实现插入内核和移除,在这里把过程记录下来方便以后查看,也给其他为之困扰的朋友一个建议. 环境: ...
- 安装Bind过程中提示丢失MSVCR110.dll的解决办法
前几天在线安装Visual Studio 2012 Update 3,由于在线安装需要不断下载安装文件,时间很长,后来等不下去,就取消了,不幸的是VS启动不了了,弹出“devenv.exe – 系统错 ...
- 如何删除 OpenStack Nova 僵尸实例
转自:http://www.vpsee.com/2011/11/how-to-delete-a-openstack-nova-zombie-instance/ 前天强制重启一台 OpenStack N ...
- MAC环境下 nodejs 4.5.0 卸载
MAC 环境下,我之前的删除 node 环境如果是用brew 安装的 node.js 4.4 之前的版本.可以网上参考其他方法,我之前的帖子也有之前的删除方法.参考帖子: http://www.cnb ...
- ionic 写一个五星评价(非指令)
Controller里的代码: .controller('evaluateCtrl', function($scope, $state, $stateParams, $ionicPopup,$ioni ...
- metasploit--exploit模块信息
Name Disclosure Date Rank Description ---- ...
- 第十一章、认识与学习BASH
第十一章.认识与学习 BASH 最近升级日期:2009/08/25 1. 认识 BASH 这个 Shell 1.1 硬件.核心与 Shell 1.2 为何要学文字接口的 shell 1.3 系统的合法 ...
- 纯CSS制作三角(转)
原原文地址:http://www.w3cplus.com/code/303.html 原文地址:http://blog.csdn.net/dyllove98/article/details/89670 ...
- PHP 中获取当前时间[Datetime Now]
在 PHP 中可以通过date()获取当前时间,在>5.2的版本中最好还是用 datetime 类型 date() <?php echo date('Y-m-d H:i:s'); ?> ...