最近有些想法,出于寂寞… 最近看docker群里不少人在写docker运维平台。 话说,我自己也有些手痒痒了,打算搞一个开源的简单的docker平台。
标注下,python解析dockerfile文件的原文地址是,http://xiaorui.cc/?p=1806
这个星期后期写了不少关于docker的小模块,是基于docker api写的,功能是批量管理,可rest api。 我的想法是docker平台越简单越好。 现在有个流程是需要模板自动解析dockerfile的配置,然后导入mongodb里,如果只是文件的读取,然后不加处理的倒入到mongodb里面,那不利于后期的表单管理。
关于这解析dockerfile的模块,本来打算自己写,但看到已经有人在github上提交了相关的代码,虽然代码写得有些简单,但返回KV格式还挺和我的胃口。 关于docker的运维平台,貌似用python开发的多点, 我认为是因为docker的python docker-py api足够的简单明了… …
这个是Redis的Dockerfile, 写的很简单,就是下载redis,并且编译安装,然后启动。
# # Redis Dockerfile # # https://github.com/dockerfile/redis # # Pull base image. FROM dockerfile/ubuntu # Install Redis. RUN \ cd /tmp && \ wget http://download.redis.io/redis-stable.tar.gz && \ tar xvzf redis-stable.tar.gz && \ cd redis-stable && \ make && \ make install && \ cp -f src/redis-sentinel /usr/local/bin && \ mkdir -p /etc/redis && \ cp -f *.conf /etc/redis && \ rm -rf /tmp/redis-stable* && \ sed -i 's/^\(bind .*\)/# \1/' /etc/redis/redis.conf && \ sed -i 's/^\(daemonize .*\)/# \1/' /etc/redis/redis.conf && \ sed -i 's/^\(dir .*\)/# \1\ndir \/data/' /etc/redis/redis.conf && \ sed -i 's/^\(logfile .*\)/# \1/' /etc/redis/redis.conf # Define mountable directories. VOLUME ["/data"] # Define working directory. WORKDIR /data # Define default command. CMD ["redis-server", "/etc/redis/redis.conf"] # Expose ports. EXPOSE 6379
上面是是dockerfile,下面是如何把dockerfile解析成json。 我们用的解析模块是 dockerfile_parser ,你只要按照dockerfile的模板写的配置,基本无问题..
#!/usr/bin/python from json import dumps from dockerfile_parser import parser parsed = parser.parse('Dockerfile') print(dumps(parsed, indent=2, separators=(',', ': '))) In [6]: print(dumps(parsed, indent=2, separators=(',', ': '))) { "workdir": { "/": { "root": { "run": [ "cd /tmp && wget http://download.redis.io/redis-stable.tar.gz && tar xvzf redis-stable.tar.gz && cd redis-stable && make && make install && cp -f src/redis-sentinel /usr/local/bin && mkdir -p /etc/redis && cp -f *.conf /etc/redis && rm -rf /tmp/redis-stable* && sed -i 's/^(bind .*)/# 1/' /etc/redis/redis.conf && sed -i 's/^(daemonize .*)/# 1/' /etc/redis/redis.conf && sed -i 's/^(dir .*)/# 1ndir /data/' /etc/redis/redis.conf && sed -i 's/^(logfile .*)/# 1/' /etc/redis/redis.conf" ] } }, "/data": { "root": { "cmd": [ [ "redis-server", "/etc/redis/redis.conf" ] ] } } }, "from": { "full_name": "dockerfile/ubuntu" }, "volume": [ "/data" ], "expose": [ 6379 ] }
Dockerfile-parse的处理流程也很简单,python代码整体也就1000多行,读取文件到一个list里面,然后定义一个orderDict有序字典,然后从上往下开始拆分并解析,解析好的塞入orderdict里面。
这个模块主要是把现成的dockerfile导出成json,如果想反着来咱们办? 估计要自己写dockerfile的生成模板了。