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

Posted

技术标签:

【中文标题】有条件地检测节点服务器是不是在 Docker 容器内运行【英文标题】: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,如果他通过容器连接,我想使用容器链接名称连接如第二种情况所述。

有什么办法吗?

【问题讨论】:

【参考方案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。会这样做。再次感谢..

以上是关于有条件地检测节点服务器是不是在 Docker 容器内运行的主要内容,如果未能解决你的问题,请参考以下文章

JVM故障问题排查心得「内存诊断系列」Docker容器经常被kill掉,k8s中该节点的pod也被驱赶,怎么分析?

如何将节点 docker 容器与 postgres docker 容器连接起来

从docker容器内的节点服务器访问ubuntu localhost

基于docker创建ansible以及管理容器节点

检查 React 应用程序是不是在 Docker 容器中运行

将 Docker 容器部署到 swarm 集群中的多个节点