容器启动之前需要先创建并绑定 mysql服务和 mongodb服务
在控制台点击 服务集成,接着创建 mysql服务和 mongodb服务,名字可以随意
mongodb使用的是mongoose连接,格式为:
mongodb://user:password@addr:port/database
在node中环境变量存储在 process.env中,所以:
user => process.env.MONGODB_USERNAME password => process.env.MONGODB_PASSWORD addr => process.env.MONGODB_PORT_27017_TCP_ADDR port => process.env.MONGODB_PORT_27017_TCP_PORT database => process.env.MONGODB_INSTANCE_NAME
mysql使用的是node-mysql,所以和上面相似
user => process.env.MYSQL_USERNAME password => process.env.MYSQL_PASSWORD database => process.env.MYSQL_INSTANCE_NAME host => process.env.MYSQL_PORT_3306_TCP_ADDR port => process.env.MYSQL_PORT_3306_TCP_PORT
持续集成中使用mysql,mongodb服务注意事项
持续集成不需要绑定任何服务,DaoCloud CI在运行测试的时候会自动创建,其使用的服务来自daocloud.yml
services: - mysql - mongodb
在持续集成中, MONGODB_USERNAME、 MONGODB_PASSWORD、 MYSQL_USERNAME 、MYSQL_PASSWORD、 MYSQL_INSTANCE_NAME 以及MONGODB_INSTANCE_NAME是不存在的,所以为了兼容容器和持续集成,代码中的连接需要进行判断,修改如下:
Mongodb
var mongoose = require('mongoose'); // 链接格式: mongodb://user:pass@localhost:port/database var mongodbUri = 'mongodb://'; // 持续集成时, MONGODB_USERNAME 和 MONGODB_PASSWORD 不存在 // 需要进行判断 if (process.env.MONGODB_USERNAME) { // 在容器中则存在,在持续集成中则不存在 mongodbUri += process.env.MONGODB_USERNAME; if (process.env.MONGODB_PASSWORD) { mongodbUri += ":" + process.env.MONGODB_PASSWORD } mongodbUri += "@"; } mongodbUri += (process.env.MONGODB_PORT_27017_TCP_ADDR || 'localhost') + ":" + (process.env.MONGODB_PORT_27017_TCP_PORT || 27017) + '/' + (process.env.MONGODB_INSTANCE_NAME || 'test');// 持续集成中MONGODB_INSTANCE_NAME 也不存在, 使用 test 代替
Mysql
// node_modules var mysql = require('mysql'); // 持续集成中MYSQL_USERNAME默认为root,并且没有MYSQL_PASSWORD // MYSQL_INSTANCE_NAME默认为test var connection = mysql.createConnection({ user: process.env.MYSQL_USERNAME || 'root', password: process.env.MYSQL_PASSWORD || '', database: process.env.MYSQL_INSTANCE_NAME || 'test', host: process.env.MYSQL_PORT_3306_TCP_ADDR || 'localhost', port: process.env.MYSQL_PORT_3306_TCP_PORT || '3306' }); // 创建连接 connection.connect(function(err) { if (err) { console.error('error connecting: ' + err.stack); return; } console.log('connected as id ' + connection.threadId); });
总结
容器运行时需要绑定mysql、mongodb服务
持续集成不需要绑定,由 daocloud.yml指定,DaoCloud CI在运行测试的时候会自动创建实例
持续集成中的mysql、mongodb服务和用户申请的mysql,mongodb实例没有任何关系