Docker容器nodejs连接到外部mysql失败

问题描述:

我的nodejs应用程序正在连接到mysql外部,如果我以 docker run -p 49160:8080 -t -i <image>和手动运行nodejs /src/server.js交互式启动,这一切都很好。 但是,当我从守护进程docker run -p 49160:8080 -d <image>开始时,它将无法连接到外部mysql。Docker容器nodejs连接到外部mysql失败

尝试docker start <container>然后docker exec <container> nodejs /src/server.js,同样的错误。

试过 docker start <container>docker attach <container>运行nodejs /src/server.js,那么它的工作。

Dockerfile:

FROM ubuntu 

COPY . /src 

RUN apt-get install nodejs 
RUN apt-get install npm 
RUN cd /src; npm install 
EXPOSE 8080 
CMD ["nodejs","/src/server.js"] 

/src/server.js:

var express = require('express'); 
var mysql = require('mysql'), 
myconnection = require('express-myconnection'); 

... 

app.use(myconnection(mysql, { 
    ... 
},'request')); 

... 

app.get('/',function(req,res) { 
    req.getConnection(function(err,connection) { 
     if(err) 
      // giving out err here, fail to connect 

UPDATE:

我发现病因竟是nodejs /src/server.jscd /src; nodejs server.js其中前者会给我连接错误和后者工作正常

所以docker run -p 49160:8080 -d <image> /bin/sh -c "cd /src; nodejs server.js"实际工作

马克,你有什么想法?仍然需要输出ifconfig? thx

+0

有趣的错误...你可以尝试创建一个脚本,首先运行'ifconfig',然后运行脚本并启动它作为启动命令?在这种情况下,哪个是输出? – mgaido 2014-11-08 10:01:15

+0

@ mark91,看到我的更新内联 – etang 2014-11-08 11:48:50

好的,所以问题似乎是你启动你的命令的目录。让我们给一个尝试CMD命令之前,您Dockerfile添加此:

WORKDIR /src 

PS没有感谢,没有更多的需要ifconfig

+0

Thx @ mark91,我会稍后尝试,但只是好奇为什么会影响与MySQL的连接,是否真的是nodejs问题而不是docker的 – etang 2014-11-08 12:08:33

+0

我认为原因是在你的js您需要的应​​用程序或包含来自另一个文件的凭证,而这些文件在您找不到的情况下未在正确的目录中执行您的命令。为了确保这一点,您可以打印它们进行调试。 – mgaido 2014-11-08 12:16:43

+0

是的,我正在使用dotenv并调用dotenv.load()加载server.js文件夹中的.env文件。所以它真的有可能是dotenv工作文件夹与nodejs相关,我将验证.env是否加载 – etang 2014-11-08 12:25:37