打包node.js應用成為docker image


轉自: https://www.douban.com/note/321815809/

其實node.js的部署並不是什么特別大的問題,有nvm,有npm,多數情況下其實部署並不是什么令人感到頭痛的問題。

實體機上的部署可以參考:
1、node.js部署最佳實踐
http://www.douban.com/note/265207425/

2、forever結合chkconfig將網站啟動和關閉都開機自服務化
http://www.douban.com/note/318448663/

3、mean.io的BUG
http://www.douban.com/note/318584640/

============================================
但是如果想做到稍稍自動化一些,docker可能是最近的一個比較好的選擇。

那么思路上來說,將你的node.js app打包成docker的image的手工步驟應該分解成幾步呢?

1、創建一個最小的裸image
2、安裝必要的依賴,比如g++
3、安裝node.js本身,並且要選擇好版本,必要時可以使用nvm
4、將app的裸代碼拷貝的建立的image當中去
5、運行npm install加載依賴(在這之前可以修改npm的repos為http模式,加快速度)
6、運行必要的自動化測試並報告結果
7、按照某種約定暴露該服務的端口號給host機
8、使用pm2或者是forever將該app服務化,並配置為開機啟動
9、調整express等模塊的運行模式,生產模式或其它
10、復雜的項目如果依賴JAVA,那么自動化部署java到image就是第一步了
11、導出剛才的那個image為打包文件?

see,很簡單吧?

好吧。。。。。。。。。。。。

==========================================

看來主要要從Dockfile入手了,說起來就像Makefile一樣簡單的東西,不是么

OK,讓我們來看看有沒有現成的項目

https://github.com/adamalex/docker-urlarchiver/blob/master/Dockerfile
http://oskarhane.com/create-a-nodejs-docker-io-image/

OK,抽出共性

得到第一版本的Dockfile就是

#從12.10開始搞
FROM ubuntu:12.10

#這里改成自己的
MAINTAINER lemonhall, lemonhall@gmail.com

#升級系統本身
RUN apt-get update && apt-get upgrade

#搞定大多數的c和c++模塊所需要的東西(不過這容易讓image變得很大)
RUN apt-get install python-software-properties python g++ make software-properties-common

#OK,加入node的二進制包倉庫,我們並不想從源碼編譯
RUN add-apt-repository ppa:chris-lea/node.js && apt-get update

#安裝 node.js
RUN apt-get install nodejs

==============================
將host機器上的項目首先打包好

tar zc --exclude node_modules --exclude .git -f app.tar.gz app

--exclude命令不打包node_modules和.git,這樣壓縮包的大小會非常小

然后
Dockfile里面開始添加用戶:
RUN useradd -m -d /home/node node
RUN usermod -a -G nobody node

接下來拷貝必要文件到虛擬機里:(這里需要變量化)
ADD app.tar.gz /home/node/
RUN su node
RUN cd /home/node/
RUN tar zxf app.tar.gz
RUN cd app
RUN npm install

===============================================
解析來的事情又需要ROOT權限了:
RUN npm install forever -g

       a)在/etc/rc.d/init.d里面加上app這個文件
       b)chmod +x app #使得文件可運行
       c)chkconfig --add app #用這個命令來加入新的服務

app這個腳本文件可能需要代碼來生成,將某些變量加入進去,另外如果是express的項目,還得然該用戶可以選擇是否將環境變量先設置為生產模式

【NODE_ENV=production】

#!/bin/bash
# chkconfig: 2345 70 30
# description: app service
# processname: app #第一個進程名,后邊設置自啟動的時候會用到
PATH=/usr/local/bin/

start() {
echo "Starting app ..."
        forever start /home/node/app/server.js
}

stop() {
        echo "Stopping mean ..."
        forever stop /home/node/app/server.js
}

# See how we were called.
case "$1" in
  start)
start
;;
  stop)
stop
;;
  restart|force-reload)
stop
start
;;
  *)
echo $"Usage: $0 {start|stop|restart|force-reload}"
exit 2
esac

======================================
以上腳本存在幾個問題:
1、如果可以,最好還是將forever生成的log暴露給宿主機,這樣可以方便查看問題。
2、該腳本有一個注定的main.js的入口才可以,這個腳本的生成和修改看上去並不是那么自動化,比如如果項目依賴mongod等等,該怎樣搞的事情,從中間配置服務器哪里讀取某些依賴的配置項?
3、另外如果可以的話,應該是一條命令就可以出發目標image里面的service star和service stop這類的命令。
4、監控


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM