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

Vig*_*.V. 6 mongodb node.js docker

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

现在,我将我的服务器放在一个容器中,将数据库放在另一个容器中,我可以像这样从服务器连接到我的数据库: mongodb://mycontainer:27017/mycollection

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

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

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

有没有办法做到这一点?

Pau*_*Rey 6

就我个人而言,当我想实现这一点时,我ENV在 Dockerfile 中设置了一个变量,如下所示:

ENV DATABASE_HOST db
Run Code Online (Sandbox Code Playgroud)

您可以获得有关Dockerfile 参考的完整文档。

然后,在您的 Node.js 代码源中,您需要知道是否DATABASE_HOST已设置(我可以将您重定向到此 Stack Overflow Jayesh 的帖子:在 Node.js 中读取环境变量):

var dbHost = 'localhost';

if (process.env.DATABASE_HOST) {
    dbHost = process.env.DATABASE_HOST;
}
Run Code Online (Sandbox Code Playgroud)

或在一行中:

var dbHost = process.env.DATABASE_HOST || 'localhost';
Run Code Online (Sandbox Code Playgroud)

然后,对于 MongoDB 连接:

var mongodbConnection = 'mongodb://' + dbHost + ':27017/mycollection'
Run Code Online (Sandbox Code Playgroud)

现在,当您运行容器时,您必须将docker run命令中的容器链接到--link <your mongodb container>:db(因为db是在变量中设置的ENV值)。

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

再次,你可以使用一个外部的MongoDB没有链接,如果你想要的任何容器(这是不是在另一个容器可能): -e DATABASE_HOST=www.mymongo.com

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