[编者的话] 当文字偶遇代码,当程序插上了翅膀,让分享成为我们彼此沟通的语言。我们期待可以构建这样一个平台让开发者们看到你们的智慧,挖掘你们的才华,让彼此在开源的路上不再孤独。“DaoCloud分享写作计划”已全面启动,欢迎投稿。
node应用程序demo
首先,选择一个平台 clone 代码到你的git平台上,譬如
在控制台点击 服务集成
;
创建 mysql服务和 mongodb服务,名字可以随意
回到控制台,点击 代码构建,创建新项目,代码源选择你刚才 clone 的
勾选 持续集成 后点击 开始创建
当镜像构建完成后,点击 部署最新版本,接着点击 基础设置,绑定 mysql 和 mongodb
容器启动后,访问下URL看看,是不是输出了mysql链接成功~~~ 并从mongodb中取出了 xinshangshangxin
持续集成 需要 push 一次代码到你的git,然后回到代码构建,选择daocloud_node_demo,如图所示
注意事项:
构建镜像必须提供 Dockerfile
持续集成必须提供 daocloud.yml
构建镜像和持续集成这两项服务完全是独立的,两者之间没有任何依赖
push 一次代码到你的git才会触发持续集成
如何在app代码中连接mysql/mongodb实例
容器启动时能访问mysql/mongodb的注意事项
容器启动之前需要先创建并绑定 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实例没有任何关系
本文来自“DaoCloud分享写作计划”,这项计划旨在为开发者提供一个平台,分享使用Docker的心得体会和技术经验。DaoCloud将为文章作者提供一定的物质奖励,具体方式请访问: