我有一個應用程序,我想在一個自包含的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的特異性嗎?
感謝,
儘管有一個建議,不要把所有東西放在一個碼頭圖像上。想'微服務' - 一個碼頭集裝箱應該只做一件事。你應該爲你的NodeJS應用程序提供一個容器,而爲RethinkDB提供另一個容器。您可以使用docker-compose來輕鬆地編排這些容器,這就是基於Docker的應用程序應該如何工作。 – huygn
嘿@HuyGiang。是的,你是完全正確的,這也是我們想要做的。考慮這是一個必要的中間步驟:)。 – jlengrand
我會從一開始就以2個獨立的容器開始,因爲構建映像會容易很多,Node和RethinkDB都有官方映像,並且無需自定義啓動腳本就可以更輕鬆地調試Node容器。 – huygn