2016-08-05 60 views
0

我有一個應用程序,我想在一個自包含的Docker映像上運行。 我在Ubuntu based image上運行得很好,但是現在這個腳本在Alpine上給我帶來麻煩。Bash腳本無法在Docker映像上運行節點

這裏是我的搬運工文件:

FROM julienlengrand/alpine-node-rethinkdb 

# Preparing 
# RUN ln -snf /bin/bash /bin/sh 

# # Define mountable directories. 
VOLUME ["/data"] 

# # Define working directory. 
WORKDIR /data 

# # Install app dependencies 
COPY package.json /data 
RUN npm install 

# # Bundle app source 
COPY . /data 

# # Expose rethinkdb ports. 
# - 8080: web UI 
# - 28015: process 
# - 29015: cluster 
EXPOSE 8080 
#EXPOSE 28015 
#EXPOSE 29015 

# Expose node app ports 
EXPOSE 4567 

CMD [ "/bin/sh", "/data/startApp.sh" ] 

我的startApp腳本是相對比較簡單:

#!/bin/sh 
rethinkdb --bind all & sleep 1; node dbCreate.js; sleep 2; nohup node workers/worker.js & node app.js 

但是當我嘗試運行它,我得到以下錯誤:

module.js:442 
    throw err; 
    ^

'rror: Cannot find module '/data/app.js 
    at Function.Module._resolveFilename (module.js:440:15) 
    at Function.Module._load (module.js:388:25) 
    at Module.runMain (module.js:575:10) 
    at run (bootstrap_node.js:352:7) 
    at startup (bootstrap_node.js:144:9) 
    at bootstrap_node.js:467:3 

無論我是自動運行還是直接在使用shell的映像中運行,都會發生這種情況。

我已檢查並且所有內容都正確放置在數據文件夾中。 此外,如果我直接在sh shell中運行所有命令,則所有命令都按預期運行。

我也試圖簡化我的腳本,例如:

#!/bin/sh 
rethinkdb --bind all & sleep 1; node dbCreate.js; sleep 2; node app.js 

BU同樣的問題發生。

任何想法可能出錯?當通過startApp腳本運行時,什麼可能導致我的/ data文件夾不可用?難道它是來自Alpine的特異性嗎?

感謝,

+1

儘管有一個建議,不要把所有東西放在一個碼頭圖像上。想'微服務' - 一個碼頭集裝箱應該只做一件事。你應該爲你的NodeJS應用程序提供一個容器,而爲RethinkDB提供另一個容器。您可以使用docker-compose來輕鬆地編排這些容器,這就是基於Docker的應用程序應該如何工作。 – huygn

+0

嘿@HuyGiang。是的,你是完全正確的,這也是我們想要做的。考慮這是一個必要的中間步驟:)。 – jlengrand

+0

我會從一開始就以2個獨立的容器開始,因爲構建映像會容易很多,Node和RethinkDB都有官方映像,並且無需自定義啓動腳本就可以更輕鬆地調試Node容器。 – huygn

回答

1

您收到像一個典型的回車問題作爲app.js後的報價看起來錯誤信息已移動到線的起點

'rror: Cannot find module '/data/app.js 

節點通常應該能夠處理有兩個行尾,但shell腳本不那麼友好。

我通常默認所有的項目/文件/編輯/混帳到Unix \n,除非有特定的要求不太。

您可以使用dos2unixquestion jlengrand found中的某個答案轉換現有文件。我喜歡perl -pi -e 's/\r\n/\n/g',因爲pie

+0

確實。問題來自我的startApp.sh腳本中的Windows回車。我通過使用這裏描述的方法在主機端刪除它:http://stackoverflow.com/questions/2613800/how-to-convert-dos-windows-newline-crlf-to-unix-newline-n-in- bash腳本 – jlengrand

+0

出於興趣,您是否需要基於'node'參數的文件?我想弄清楚回車是如何進入模塊加載器的。 – Matt

+0

不,我在腳本中唯一要做的就是調用節點app.js.我沒有碰過節點腳本。我也有點驚訝,它足夠了,tbh,並期望不得不unixify節點的應用程序。 – jlengrand