# -*- coding: utf-8 -*-
def print_tree(tree):
buff = ['ROOT/']
_print_tree(tree, buff, '', 0)
print('\n'.join(buff))
def _print_tree(tree, buff, prefix, level):
count = len(tree)
for k, v in tree.items():
count -= 1
if v:
buff.append('%s +- %s/' % (prefix, k))
if count > 0:
_print_tree(v, buff, prefix + ' | ', level + 1)
else:
_print_tree(v, buff, prefix + ' ', level + 1)
else:
buff.append('%s +- %s' % (prefix, k))
def test():
tree = {
'bin': { 'bash': None, 'cat': None, 'cp': None, },
'etc': {
'init.d': { 'apache2':None, 'slapd':None, 'sshd':None, },
'passwd': None,
'hosts': None,
},
'var': {
'log': {
'apache2': { 'accesslog':None, 'errorlog': None, },
},
},
}
print_tree(tree)
if __name__ == '__main__':
test()
输出结果:
ROOT/+- etc/
| +- passwd
| +- init.d/
| | +- apache2
| | +- sshd
| | +- slapd
| +- hosts
+- bin/
| +- cp
| +- bash
| +- cat
+- var/
+- log/
+- apache2/
+- errorlog
+- accesslog
那么如何做到溯源,要求docker file中From 或者Label字段上记录该image的上游。如果能保证按照这条规则执行,那么我们会得到类似于这样的信息:
继续思考:观察数据会发现好多image会有同样的base image,那么针对这些image,我们需要将他们归并到一条分支上。或者说要找出他们的祖先,将他们归并道对应的祖先分支上。那么思想和树很像了,决定用树形结构来处理。
简化抽象需求,画出简图如下:
使用python treelib模块构造多叉树:
将每一层的树节点的id,编为child1,child11...child2,child22...同一层后缀数字一样,个数不一样,不同层数字不一样,以此类推。这样的好处就是我能根据节点ID,就知道它属于第几层。