2016-02-25 447 views
2

我有一個dockerized項目,有三個應用程序和三個數據庫。這三個應用程序都是用節點編寫的,並像往常一樣使用npmnpm安裝一個docker-compose項目

我有一個克隆三個回購的腳本,docker-compose.yaml安裝三個容器,並使用Dockerfile三個項目中的每一個基本上只是做一個npm install並運行它們。

這一切都工作正常,但此練習的重點是使項目的羣集易於設置和運行的目的進行開發。實際上在項目代碼上工作並不是問題,因爲它被開發人員克隆,但npm install是通過docker和root來完成的。這意味着回購中的node_modules由root擁有。

開發人員不能簡單地做npm install到一個新的包添加到回購,因爲他們不會對node_modules權限和模塊時還可能取決於他們的主機系統上的不同建築風格建造。

我曾想過創建運行在容器而不是npm install的腳本,但是這有幾個需要注意的地方:

  1. root將擁有package.json
  2. 這打破了一個典型的節點開發的流...它們被用來只是做npm install

就像我上面說的,這個整點是使其容易在跳躍和發展越好,所以我希望得到儘可能盡我所能接近一個共同的發展經驗。

對於在Docker容器中處理節點模塊安裝以開發項目是否有任何建議?

回答

1

安裝的源文件夾的一個常見問題,迄今爲止我提出的最佳解決方案是簡單地將主機用戶的uid/gid與容器中的某個固定用戶相匹配。直到最近,一個不得不求助於一些外部工具和dockerfile /組合模板,用最新的泊塢窗,撰寫版本(> = 1.6.0)你可以做以下現在:

Dockerfile:

FROM busybox 
ARG HOST_UID=1000 
RUN adduser -D -H -u ${HOST_UID} -s /bin/sh npm 
USER npm 
RUN echo "i'm $(whoami) and have uid: ${HOST_UID}" 

請注意ARG指令。 HOST_UID的值在運行時通過docker build --build-arg HOST_UID=${UID}傳遞。然後,只需添加一個自定義的npm用戶,其值爲HOST_UID作爲其uid,並將其設置爲默認USER以用於所有以下命令。

--build-arg現在也由碼頭工人,撰寫和新版本2陽明格式支持:

version: '2' 
services: 
    foo: 
    build: 
     context: . 
     args: 
     HOST_UID: ${UID} 

提供UID設置你的主機上,docker-compose up foo將建立與您uid上匹配的默認用戶圖像主人。我在那裏學到的重要教訓是uid/gid對於權限來說都是重要的,實際的用戶/組名是無關緊要的。

我用過幾次的另一種技術是,如果設置了某個env,則通過容器啓動時的sed替換/etc/passwd/中固定用戶的uid。這可以避免圖像重建,適用於預計從某個存儲庫直接運行的圖像。

最後,我會建議完全接受碼頭理念,這意味着您的開發人員應該只使用項目容器來執行諸如npm install之類的任務。您避免了不可避免的版本不匹配和其他令人頭痛的問題。

+0

你的回答很有意義,但只是一些跟進。 1000'會成爲我想每次都使用的UID嗎?你能否再詳細說一下你的最後一段。你指的是什麼版本的不匹配頭痛?他們也會在主機上編輯和使用代碼,而不是在容器中(儘管只要我能夠記錄如何通過容器來執行'npm install') –

+0

'1000'在這種情況下只是一個提供了默認值,否則'--build-arg HOST_UID ='成爲開始構建的需求。通過版本不匹配,我引用了開發主機和容器內的工具。使用主機的IDE很好。 –