2014-11-08 145 views
0

我的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

回答

0

好的,所以問題似乎是你啓動你的命令的目錄。讓我們給一個嘗試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