From dcf78ad6ef046739507f36d0ca00f1b512b7d0b0 Mon Sep 17 00:00:00 2001 From: zicla Date: Mon, 29 Jan 2018 20:11:21 +0800 Subject: [PATCH] Add a new method for declare configs. --- Dockerfile | 2 +- README.md | 2 +- build/conf/tank.json | 2 +- docker-compose.yml | 12 +++-- rest/config.go | 102 ++++++++++++++++++++++++++++++++++++------- 5 files changed, 98 insertions(+), 22 deletions(-) diff --git a/Dockerfile b/Dockerfile index 7a24f80..3d973b7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # 使用1.8的golang作为母镜像 -FROM golang:1.8 +FROM golang:1.9 # 维护者信息 MAINTAINER eyeblue "eyebluecn@126.com" diff --git a/README.md b/README.md index fc0d041..49c10ec 100644 --- a/README.md +++ b/README.md @@ -77,7 +77,7 @@ //Mysql数据库名称 "MysqlSchema": "tank", //Mysql用户名,建议为蓝眼云盘创建一个用户,不建议使用root - "MysqlUserName": "tank", + "MysqlUsername": "tank", //Mysql密码 "MysqlPassword": "tank123", //超级管理员用户名,只能是字母和数字 diff --git a/build/conf/tank.json b/build/conf/tank.json index f216409..aa69077 100644 --- a/build/conf/tank.json +++ b/build/conf/tank.json @@ -4,7 +4,7 @@ "MysqlPort": 3306, "MysqlHost": "127.0.0.1", "MysqlSchema": "tank", - "MysqlUserName": "tank", + "MysqlUsername": "tank", "MysqlPassword": "tank123", "AdminUsername": "admin", "AdminEmail": "admin@tank.eyeblue.cn", diff --git a/docker-compose.yml b/docker-compose.yml index 7616553..d00e84d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -21,10 +21,14 @@ services: - "6010:6010" restart: always environment: - TANK_DB_HOST: db - TANK_DB_PORT: 3306 - TANK_DB_USER: tank - TANK_DB_PASSWORD: tank123 + TANK_MYSQL_PORT: 3306 + TANK_MYSQL_HOST: db + TANK_MYSQL_SCHEMA: tank + TANK_MYSQL_USERNAME: tank + TANK_MYSQL_PASSWORD: tank123 + TANK_ADMIN_USERNAME: lish + TANK_ADMIN_EMAIL: lish@tank.eyeblue.cn + TANK_ADMIN_PASSWORD: 123456 volumes: db_data: \ No newline at end of file diff --git a/rest/config.go b/rest/config.go index 7724b45..5d4cc51 100644 --- a/rest/config.go +++ b/rest/config.go @@ -8,6 +8,8 @@ import ( "io/ioutil" "time" "unsafe" + "os" + "strconv" ) const ( @@ -29,7 +31,7 @@ flush privileges; */ /* 你也可以在运行时的参数中临时修改一些配置项: --MysqlHost=127.0.0.1 -MysqlPort=3306 -MysqlSchema=tank -MysqlUserName=tank -MysqlPassword=tank123 +-MysqlHost=127.0.0.1 -MysqlPort=3306 -MysqlSchema=tank -MysqlUsername=tank -MysqlPassword=tank123 */ var ( CONFIG = &Config{ @@ -47,11 +49,11 @@ var ( //数据库名字 MysqlSchema: "tank", //用户名 - MysqlUserName: "tank", + MysqlUsername: "tank", //密码 MysqlPassword: "tank123", //数据库连接信息。这一项是上面几项组合而得,不可直接配置。 - MysqlUrl: "%MysqlUserName:%MysqlPassword@tcp(%MysqlHost:%MysqlPort)/%MysqlSchema?charset=utf8&parseTime=True&loc=Local", + MysqlUrl: "%MysqlUsername:%MysqlPassword@tcp(%MysqlHost:%MysqlPort)/%MysqlSchema?charset=utf8&parseTime=True&loc=Local", //超级管理员用户名,只能包含英文和数字 AdminUsername: "admin", //超级管理员邮箱 @@ -77,7 +79,7 @@ type Config struct { //数据库名字 MysqlSchema string //用户名 - MysqlUserName string + MysqlUsername string //密码 MysqlPassword string //数据库连接信息。 @@ -98,8 +100,8 @@ func (this *Config) validate() { LogPanic("ServerPort 未配置") } - if this.MysqlUserName == "" { - LogPanic("MysqlUserName 未配置") + if this.MysqlUsername == "" { + LogPanic("MysqlUsername 未配置") } if this.MysqlPassword == "" { @@ -118,7 +120,7 @@ func (this *Config) validate() { LogPanic("MysqlSchema 未配置") } - this.MysqlUrl = fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local", this.MysqlUserName, this.MysqlPassword, this.MysqlHost, this.MysqlPort, this.MysqlSchema) + this.MysqlUrl = fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local", this.MysqlUsername, this.MysqlPassword, this.MysqlHost, this.MysqlPort, this.MysqlSchema) } @@ -143,11 +145,8 @@ func init() { }, nil) } -//从conf/tank.json中获取变量。 - -//从flag中或者conf/tank.json中装填变量 -func PrepareConfigs() { - +//第一级. 从配置文件conf/tank.json中读取配置项 +func LoadConfigFromFile() { //读取配置文件 filePath := GetConfPath() + "/tank.json" content, err := ioutil.ReadFile(filePath) @@ -161,6 +160,65 @@ func PrepareConfigs() { } } +} + +//第二级. 从环境变量中读取配置项 +func LoadConfigFromEnvironment() { + + tmpServerPort := os.Getenv("TANK_SERVER_PORT") + if tmpServerPort != "" { + i, e := strconv.Atoi(tmpServerPort) + if e == nil { + CONFIG.ServerPort = i + } else { + LogPanic(fmt.Sprintf("环境变量TANK_SERVER_PORT必须为整数!%v", tmpServerPort)) + } + } + + tmpMysqlPort := os.Getenv("TANK_MYSQL_PORT") + if tmpMysqlPort != "" { + i, e := strconv.Atoi(tmpMysqlPort) + if e == nil { + CONFIG.MysqlPort = i + } else { + LogPanic(fmt.Sprintf("环境变量TANK_MYSQL_PORT必须为整数!%v", tmpMysqlPort)) + } + } + + tmpMysqlHost := os.Getenv("TANK_MYSQL_HOST") + if tmpMysqlHost != "" { + CONFIG.MysqlHost = tmpMysqlHost + } + tmpMysqlSchema := os.Getenv("TANK_MYSQL_SCHEMA") + if tmpMysqlSchema != "" { + CONFIG.MysqlSchema = tmpMysqlSchema + } + tmpMysqlUsername := os.Getenv("TANK_MYSQL_USERNAME") + if tmpMysqlUsername != "" { + CONFIG.MysqlUsername = tmpMysqlUsername + } + tmpMysqlPassword := os.Getenv("TANK_MYSQL_PASSWORD") + if tmpMysqlPassword != "" { + CONFIG.MysqlPassword = tmpMysqlPassword + } + tmpAdminUsername := os.Getenv("TANK_ADMIN_USERNAME") + if tmpAdminUsername != "" { + CONFIG.AdminUsername = tmpAdminUsername + } + tmpAdminEmail := os.Getenv("TANK_ADMIN_EMAIL") + if tmpAdminEmail != "" { + CONFIG.AdminEmail = tmpAdminEmail + } + tmpAdminPassword := os.Getenv("TANK_ADMIN_PASSWORD") + if tmpAdminPassword != "" { + CONFIG.AdminPassword = tmpAdminPassword + } + +} + +//第三级. 从程序参数中读取配置项 +func LoadConfigFromArguments() { + //从运行时参数中读取,运行时参数具有更高优先级。 //系统端口号 ServerPortPtr := flag.Int("ServerPort", CONFIG.ServerPort, "server port") @@ -172,7 +230,7 @@ func PrepareConfigs() { MysqlPortPtr := flag.Int("MysqlPort", CONFIG.MysqlPort, "mysql port") MysqlHostPtr := flag.String("MysqlHost", CONFIG.MysqlHost, "mysql host") MysqlSchemaPtr := flag.String("MysqlSchema", CONFIG.MysqlSchema, "mysql schema") - MysqlUserNamePtr := flag.String("MysqlUserName", CONFIG.MysqlUserName, "mysql username") + MysqlUsernamePtr := flag.String("MysqlUsername", CONFIG.MysqlUsername, "mysql username") MysqlPasswordPtr := flag.String("MysqlPassword", CONFIG.MysqlPassword, "mysql password") //超级管理员信息 @@ -203,8 +261,8 @@ func PrepareConfigs() { CONFIG.MysqlSchema = *MysqlSchemaPtr } - if *MysqlUserNamePtr != CONFIG.MysqlUserName { - CONFIG.MysqlUserName = *MysqlUserNamePtr + if *MysqlUsernamePtr != CONFIG.MysqlUsername { + CONFIG.MysqlUsername = *MysqlUsernamePtr } if *MysqlPasswordPtr != CONFIG.MysqlPassword { @@ -223,6 +281,20 @@ func PrepareConfigs() { CONFIG.AdminPassword = *AdminPasswordPtr } +} + +//三种方式指定配置项,后面的策略会覆盖前面的策略。 +func PrepareConfigs() { + + //第一级. 从配置文件conf/tank.json中读取配置项 + LoadConfigFromFile() + + //第二级. 从环境变量中读取配置项 + LoadConfigFromEnvironment() + + //第三级. 从程序参数中读取配置项 + LoadConfigFromArguments() + //验证配置项的正确性 CONFIG.validate()