docker运维平台之python解析Dockerfile配置

最近有些想法,出于寂寞… 最近看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的生成模板了。 


大家觉得文章对你有些作用! 如果想赏钱,可以用微信扫描下面的二维码,感谢!
另外再次标注博客原地址  xiaorui.cc

发表评论

电子邮件地址不会被公开。 必填项已用*标注