我有我的node.js代码,我建立了这样的mongodb连接:mongodb://localhost:27017/mycollection
现在,我将服务器放在一个容器中,将db放在另一个容器中,我可以从服务器连接到我的数据库,如下所示:mongodb://mycontainer:27017/mycollection
我在服务器代码/配置中配置了此连接字符串。
现在,我如何检测一个人是否在容器中运行服务器,并相应地获取数据库的连接字符串?
如果他在主机上运行它,我想使用第一个连接字符串和localhost并连接到主机中的数据库,如果他通过容器连接,我想使用容器链接名称来连接如第二种情况所述。
有没有办法做到这一点?
答案 0 :(得分:1)
就个人而言,当我想要实现这一点时,我在Dockerfile中设置了一个ENV
变量,如下所示:
ENV DATABASE_HOST db
您可以在Dockerfile reference上获得完整的文档。
然后,在您的Node.js代码源中,您需要知道DATABASE_HOST
是否已设置(我可以将您重定向到this Stack Overflow Jayesh's post: Read environment variables in Node.js):
var dbHost = 'localhost';
if (process.env.DATABASE_HOST) {
dbHost = process.env.DATABASE_HOST;
}
或一行:
var dbHost = process.env.DATABASE_HOST || 'localhost';
然后,对于MongoDB连接:
var mongodbConnection = 'mongodb://' + dbHost + ':27017/mycollection'
现在,当您运行容器时,必须将docker run
命令中的容器与--link <your mongodb container>:db
相关联(因为db
是ENV
变量中设置的值)
但是,您还可以使用选项-e DATABASE_HOST=<somthing else>
(再次使用docker run
命令)并使用另一个名称的MongoDB容器:-e DATABASE_HOST=anotherOne --link mongo:anotherOne
。< / p>
再次,您可以使用外部MongoDB而无需链接任何容器(如果您不想在另一个容器中):-e DATABASE_HOST=www.mymongo.com
。
编辑:这个解决方案可能比识别应用程序是否在Docker容器中运行更好,因为有了这个,你的代码可以在任何地方使用。