CoreOS的toolbox相关
CoreOS上有个很好用的工具叫toolbox,默认相当于一个与主机环境绑定的fedora:latest容器环境(是systemd的容器,非Docker);这是个脚本文件,代码不长,但内容不少;)
下面是我碰到的一些情况及处理方案:
自定义镜像或其他操作
看代码可以发现,toolbox执行时会在主要变量设置后去检测/执行以下两个文件(如果存在的话)
source /etc/default/toolbox
source "${HOME}"/.toolboxrc
所以解决方案就很简单了,随便在上面哪个文件里设置对应的变量或相关操作即可,比如:
TOOLBOX_DOCKER_IMAGE=centos
TOOLBOX_DOCKER_TAG=7
从指定的url下载镜像
看代码也是可以的,只要设置TOOLBOX_DOCKER_ARCHIVE变量即可(指向一个.tar.xz格式的镜像文件),但代码里感觉处理得不是很完善,所以在自定义配置文件里要多加些代码:
#清空镜像名/TAG至少一个
TOOLBOX_DOCKER_IMAGE=fedora
TOOLBOX_DOCKER_TAG=
#设置TOOLBOX_NAME名
TOOLBOX_NAME=fedlra-latest
#设置镜像下载地址(须wget支持)
TOOLBOX_DOCKER_ARCHIVE=http://xxxxxxxxx/xxx/xxx.tar.xz
镜像可不可以用本地文件或者手动安装…
在前一步中,由于脚本里是用wget下载的,而wget不支持本地文件(也不支持file://),所以只能手动处理了:
# 代码复制并修改自toolbox,可放入.toolboxrc执行
# - X_IMG_NAME为docker镜像名
# - X_IMG_TAG为docker镜像标记
# - 其他变量同toolbox
machinename=$(echo "${USER}-${X_IMG_NAME}-${X_IMG_TAG}" | sed -r 's/[^a-zA-Z0-9_.-]/_/g')
machinepath="${TOOLBOX_DIRECTORY}/${machinename}"
osrelease="${machinepath}/etc/os-release"
if [ ! -f "${osrelease}" ]; then
tmpdir=$(mktemp -d -p /var/tmp/)
tmpfile=${tmpdir}/docker-${X_IMG_NAME}-${X_IMG_TAG}.tar
trap "sudo rm -rf ${tmpdir}" EXIT PIPE
docker pull "${X_IMG_NAME}:${X_IMG_TAG}" || exit 1
docker save "${X_IMG_NAME}:${X_IMG_TAG}" -o "${tmpfile}" || exit 1
sudo tar -C ${tmpdir} -xf "${tmpfile}"
sudo mkdir -p ${machinepath}
sudo find ${tmpdir} -name layer.tar -type f -exec tar -C ${machinepath} -xf {} \;
trap - EXIT PIPE
sudo rm -rf ${tmpdir}
fi
*其他方案*
toolbox其实也只是一个脚本而已,自己复制一份按自己需求修改下,然后运行自己的toolbox即可;)
备注:以上功能,我已经写了一个专门的ansible的role模块coreos-toolboxrc(https://github.com/ximenpo/ansible-role-coreos-toolboxrc),可以参考使用。
Written on July 25, 2017