首页 存档 技术 查看内容

使用python自动生成docker nginx反向代理配置

2018-3-30 13:00 |来自: 互联网 440 0

摘要: 由于在测试环境上用docker部署了多个应用,而且他们的端口有的相同,有的又不相同,数量也比较多,在使用jenkins发版本的时候,不好配置,于是想要写一个脚本,能在docker 容器创建、停止的时候,自动生成nginx反向 ...

由于在测试环境上用docker部署了多个应用,而且他们的端口有的相同,有的又不相同,数量也比较多,在使用jenkins发版本的时候,不好配置,于是想要写一个脚本,能在docker 容器创建、停止的时候,自动生成nginx反向代理,然后reload nginx

我的原则是尽量简单,轻量,内存占用少

目标很明确,只要能禁用词语到docker的容器启动/停止事件,即可

网上查了一下可以用docker events来禁用词语docker事件,试了一下,发现基本可以满足,于是用python写了一段程序,用来禁用词语docker事件

python

#!/usr/bin/python# coding: utf8import osimport jsonimport reimport subprocessdef override(path, text):
  if not os.path.exists(path) and os.path.exists(path "_temp"):
    os.rename(path "_temp",path)
  fw = open(path "_temp", 'wb')
  fw.write(text)
  fw.close()  if os.path.exists(path):
    os.remove(path)
  os.rename(path "_temp", path)def read(path):
  try:
    fr = open(path, "rb")  except IOError:    print "The file don't exist, Please double check!"
    return
  lines = fr.readlines()
  ret = ''
  for line in lines:
    ret  = line  return retdef read_jsonfile(path):
  return json.loads(read(path))def cmd(command):
  return os.popen(command).read()def get_name(container):
  return cmd("docker inspect -f '{{.Name}}' "   container).replace("/", "").replace('\n', '')def get_ip(container):
  return cmd("docker inspect -f '{{.NetworkSettings.IPAddress}}' "   container).replace('\n', '')def get_port(container):
  return cmd("docker inspect -f '{{.Config.ExposedPorts}}' "   container).replace('/tcp:{}]', '').replace('map[', '').replace('\n', '')def get_info(container):
  filename = "/var/lib/docker/containers/"   container   "/config.v2.json"
  config = read_jsonfile(filename)

  name = config['Name'].replace("/", "")
  port = config['Config']['ExposedPorts'].keys()[0].replace('/tcp', '')
  ip = cmd("docker inspect -f '{{.NetworkSettings.IPAddress}}' "   name)  # ip = config['NetworkSettings']['Networks']['bridge']['IPAddress']

  ret = {'name': name, 'port': port, 'ip': ip}  return ret


tpl = """
  server {
    listen 80;
    server_name $name.test.com;
    location / {
    proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header Host $http_host;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_pass http://$ip:$port;
    }
  }
"""def generate_conf():
  print "generate_conf"
  out = cmd("docker ps | grep -v CONTAINER | awk '{print $1}'")
  containers = out.split("\n")
  servers = ''
  hosts = ''
  for con in containers:    if con != '':
      name = get_name(con)
      ip = get_ip(con)
      port = get_port(con)      print ip, port      if len(port)
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

相关分类

返回顶部