当前位置 博文首页 > python 如何把docker-compose.yaml导入到数据库相关条目里

    python 如何把docker-compose.yaml导入到数据库相关条目里

    作者:怠惰的小小白 时间:2021-02-10 18:02

    实现将docker-compose.yaml导入相关的数据库条目的功能,利用python脚本,yaml、sqlalchemy、json等模块实现。

    docker-compose.yaml

    _version: "1"
    services:
      webapp:
       build:
        context: ./dir
        dockerfile: Dockerfile-alternate
        args:
         buildno: 1

    python deme文件。

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    import yaml
    import traceback
    from sqlalchemy import create_engine
    from sqlalchemy.orm import sessionmaker
    from sqlalchemy import Column, DateTime, Index, Integer, String, Text, text, BigInteger
    from sqlalchemy.ext.declarative import declarative_base
    import datetime
    import json
    import base64
     
    """
    作用:将docker-compose.yaml导入到数据库的docker-compose表中。
    docker-compose表创建语句:
     CREATE TABLE `docker_compose` (
     `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
     `services` text NOT NULL COMMENT '@desc services',
     `creator` int(11) DEFAULT '0',
     `modifier` int(11) DEFAULT '0',
     `gmt_created` datetime NOT NULL,
     `gmt_modified` datetime NOT NULL,
     `_version` varchar(64) DEFAULT NULL,
     PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=1092 DEFAULT CHARSET=utf8 
    """
     
     
    def now():
      return datetime.datetime.now()
     
     
    BASE = declarative_base()
     
     
    class DockerCompose(BASE):
      __tablename__ = 'docker_compose'
     
      id = Column(BigInteger, primary_key=True)
      services = Column(Text, nullable=False)
      _version = Column(String(64))
      creator = Column(Integer, server_default=text("'0'"))
      modifier = Column(Integer, server_default=text("'0'"))
      gmt_created = Column(DateTime, nullable=False)
      gmt_modified = Column(DateTime, nullable=False)
     
     
    def get_session(db_connection):
      """
      db connection api
      :param db_connection:
      :return:
      """
      DB_URL = 'mysql+pymysql://%s' % (db_connection,)
      engine = create_engine(DB_URL, pool_size=25, pool_recycle=3600, echo=False)
      Session = sessionmaker(bind=engine)
      return Session()
     
     
    def load_yaml(filename):
      try:
        with open(filename, 'r') as fh:
          return yaml.safe_load(fh)
      except (IOError, yaml.YAMLError) as e:
     
        raise Exception(u"{}".format(traceback.format_exc()))
     
     
    def import_engine_compose(instance_config, dbConnection):
      services = instance_config['services']
      _version = instance_config.get('_version')
      session = get_session(dbConnection)
     
      docker_compose = DockerCompose(
        gmt_created=datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
        gmt_modified=datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
        creator=999,
        modifier=999,
        _version=_version,
        services=json.dumps(services)
      )
     
      session.add(docker_compose)
      session.commit()
     
     
    def main(dbConnection, filepath="docker_compose.yaml"):
      docker_compose_config = load_yaml(filepath)
      import_engine_compose(docker_compose_config, dbConnection)
     
     
    if __name__ == '__main__':
      dbConnection = "xxx"
     
      DB_CONNECTION = base64.b64decode(dbConnection)
      main(DB_CONNECTION)

    补充:docker-compose.yaml的编写

    当我们打包好了镜像的时候,一个一个区整理的时候,也是很浪费功夫,尤其是我们修改了一些代码的时候

    version: "2"
    services:
      mysql:
        image: mysql:mysql
        hostname: mysql
        ports:
          - "3306:3306"
        volumes:
          - "/data/mysql:/var/lib/mysql"
        restart: always
      backend:
        image: backend:0.5
        command: "python3 main.py"
        hostname: backend
        volumes:
          - "/data/files:/app/files"
        network_mode: "host"
        depends_on:
          - mysql
        restart: always
      frontend:
        image: frontend:0.5
        hostname: frontend
        volumes:
          - "/Users/gaven/Desktop/anji/frontend/web/nginx.conf:/etc/nginx/nginx.conf"
          - "/Users/gaven/Desktop/anji/frontend/web/default.conf:/etc/nginx/conf.d/default.conf"
        ports:
          - "80:80"
        network_mode: "host"
        restart: always

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持站长博客。如有错误或未考虑完全的地方,望不吝赐教。

    js
    下一篇:没有了