2014-11-05 284 views
8

我正在使用Docker,因此這種情況可能看起來很奇怪。但是我希望我的整個/data目錄在開發時安裝在我的Docker容器中。npm package.json和docker(安裝它...)

我的/data文件夾容器我的package.json文件,app目錄和一堆其他的東西。 問題是我想我的node_modules文件夾不是永久的,只有package.json文件。

我已經嘗試了幾件事情,但package.jsonnpm是給我在這裏很難......

  • 直接安裝在package.json文件將打破NPM。 npm嘗試在保存時重命名文件,這在裝入文件時是不可能的。
  • 掛載父文件夾(/data)將掛載node_modules文件夾。
  • 我無法找到任何配置選項把node_modules在另一個文件夾外/data,例如/dist
  • package.json/data/conf安裝/data/conf的體積,而不是不會工作。我無法找到任何方式來指定npmrc中的package.json路徑。
  • package.json置於/data/conf,並將其符號鏈接到/data/package.json將無法​​正常工作。 npm打破了符號鏈接並用文件替換它。

複製數據來回/從泊塢窗內的容器就是我正在做它現在..有點乏味。我也希望有一個乾淨的解決方案..

+0

這是一個笨手笨腳的工具,但會unionfs覆蓋不能解決你的問題? – Wrikken 2014-11-07 13:44:50

+0

由於該文件作爲容器內的安裝點可見,因此它很重要。它無法重命名(替換)該文件,因爲替換後它將從掛載點斷開。 – xeor 2014-11-07 20:49:51

+0

我通過使用全局安裝路徑完成了此操作:http://www.saulshanabrook.com/npm-docker-sharing -volumes/ – 2015-10-09 15:15:36

回答

7

正如你已經回答,我認爲這可能是目前唯一的解決方案。

當你建立你的碼頭工人的形象,做這樣的事情:

COPY data/package.json /data/ 
RUN mkdir /dist/node_modules && ln -s /dist/node_modules /data/node_modules && cd /data && npm install 

而對於其他的東西(如涼亭,做同樣的事情)

COPY data/.bowerrc /data/ 
COPY data/bower.json /data/ 
RUN mkdir /dist/vendor && ln -s /dist/vendor /data/vendor && cd /data && bower install --allow-root 

而且COPY data/ /data末(所以當data發生變化時,您可以使用Dockers緩存而不必執行npm/docker安裝。

您還需要創建您需要的符號鏈接並將它們存儲在您的git-repo中。它們在外面是無效的,但會在你的容器內部發生。

使用此解決方案,您可以安裝您的$PWD/data:/data,而不會在容器外部獲得npm/bower「垃圾」。並且您仍然可以將您的映像構建爲獨立部署您的服務。

0

也許你可以節省您的容器,然後定期用最小dockerfile重建它

FROM my_container

和含有

/數據的.dockerignore文件/ node_modules

看到該文檔 http://docs.docker.com/reference/builder/#the-dockerignore-file

+1

在一個開發人員面前,當有很多變化並且使用無花果來啓動env時,這不是一個好的解決方案。唯一的問題是這個package.json文件,其他都沒有。這種解決方案也會使所有事情變得複雜。 – xeor 2014-11-07 20:48:19

1

我是把在/dist/node_modules的node_modules文件夾,並從/data/node_modules作出一個符號鏈接到它去解決方案。我可以在我的Dockerfile中做到這一點,所以它將在構建時使用它,並且我可以將我的符號鏈接提交給我的git-repo。一切都很好...

4

一種類似的替代方法是使用NODE_ENV變量而不是創建符號鏈接。

RUN mkdir -p /dist/node_modules RUN cp -r node_modules/* /dist/node_modules/ ENV NODE_PATH /dist/node_modules

在這裏,你首先要建立node_modules一個新的目錄,複製所有模塊存在,並有節點從那裏讀模塊。

+0

如果我們需要運行'grunt'命令,它將無法工作。 – lvarayut 2015-11-19 06:38:27

3

現在我已經有這個問題了一段時間,和接受的解決方案並沒有爲我工作*

我發現這個link,其中有指向here編輯,這確實爲我工作:

volumes: 
    - ./:/data 
    - /data/node_modules 

在這種情況下,發動機會創建一個卷(見volumesCompose reference)未安裝到您的源目錄。這是最簡單的解決方案,並沒有要求我做任何符號鏈接,設置路徑等

僅供參考,我的簡單Dockerfile看起來就像這樣:

# install node requirements 
WORKDIR /data 
COPY ./package.json ./package.json 
RUN npm install -qq 

# add source code 
COPY ./ ./ 

# run watch script 
CMD npm run watch 

(該watch腳本只是webpack --watch -d

希望這能夠幫助別人,併爲我節省數小時的時間!


「*」 =我不能得到 webpack從我 package.json腳本工作,並安裝任何東西,而在容器內創建了不管我剛安裝的 node_modules文件夾(我跑 npm i --save [packages]從容器裏拿到包更新 package.json直到下一次重建)

相關問題