有条件地检测节点服务器是否在Docker容器内运行

时间:2018-06-01 09:25:35

标签: node.js mongodb docker

我有我的node.js代码,我建立了这样的mongodb连接:mongodb://localhost:27017/mycollection

现在,我将服务器放在一个容器中,将db放在另一个容器中,我可以从服务器连接到我的数据库,如下所示:mongodb://mycontainer:27017/mycollection

我在服务器代码/配置中配置了此连接字符串。

现在,我如何检测一个人是否在容器中运行服务器,并相应地获取数据库的连接字符串?

如果他在主机上运行它,我想使用第一个连接字符串和localhost并连接到主机中的数据库,如果他通过容器连接,我想使用容器链接名称来连接如第二种情况所述。

有没有办法做到这一点?

1 个答案:

答案 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相关联(因为dbENV变量中设置的值)

但是,您还可以使用选项-e DATABASE_HOST=<somthing else>(再次使用docker run命令)并使用另一个名称的MongoDB容器:-e DATABASE_HOST=anotherOne --link mongo:anotherOne。< / p>

再次,您可以使用外部MongoDB而无需链接任何容器(如果您不想在另一个容器中):-e DATABASE_HOST=www.mymongo.com

编辑:这个解决方案可能比识别应用程序是否在Docker容器中运行更好,因为有了这个,你的代码可以在任何地方使用。