【问题标题】:Conditionally detecting whether a Node server is running inside a Docker Container有条件地检测节点服务器是否在 Docker 容器内运行
【发布时间】:2018-11-11 09:43:48
【问题描述】:

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

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

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

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

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

有什么办法吗?

【问题讨论】:

    标签: node.js mongodb docker


    【解决方案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

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

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

    【讨论】:

    • 非常感谢。我不知道为什么我也没有考虑为 DB 主机使用 ENV。会这样做。再次感谢..
    猜你喜欢
    • 1970-01-01
    • 2022-10-27
    • 1970-01-01
    • 2020-11-17
    • 1970-01-01
    • 2020-12-22
    • 2020-08-04
    • 1970-01-01
    • 2017-09-25
    相关资源
    最近更新 更多