4

我想使用Docker爲簡單的node.js項目創建開發環境。我想在Docker容器中安裝我的項目的依賴項(它們都是npm包)(所以它們不會碰到我的主機)並仍然使用捲來安裝我的代碼。因此,容器應該能夠 在裝入卷的路徑中找到node_modules文件夾,但我不應該從主機上看到它。在Docker中安裝npm依賴關係和從卷測試

這是我Dockerfile:

FROM node:6 


RUN mkdir /code 
COPY package.json /code/package.json 
WORKDIR /code 

RUN npm install 

這是我如何運行它:

docker build --tag my-dev-env . 

docker run --rm --interactive --tty --volume $(pwd):/code my-dev-env npm test 

,這是我的package.json:

{ 
    "private": true, 
    "name": "my-project", 
    "version": "0.0.0", 
    "description": "My project", 
    "scripts": { 
     "test": "jasmine" 
    }, 
    "devDependencies": { 
     "jasmine": "2.4" 
    }, 
    "license": "MIT" 
    } 

它失敗,因爲它可以找不到jasmine,所以它不是真的安裝它:

> jasmine 

sh: 1: jasmine: not found 

我想用Docker完成什麼?另一種方法是在全球範圍內安裝軟件包。我也試過npm install -g無濟於事。

我在Debian上使用Docker版本1.12.1構建23cf638。

回答

2

該解決方案還聲明/code/node_modules作爲一個卷,只是沒有綁定掛載到主機中的任何目錄。就像這樣:

docker run --rm --interactive --tty --volume /code/node_modules --volume $(pwd):/code my-dev-env npm test 

如圖所示由@JesusRT,npm install是工作得很好,但綁定安裝$(pwd)/code獨顯圖像中陰影的/code現有內容。我們可以通過將容器中的/code聲明爲數據量來恢復我們想要的任何內容 - 在這種情況下,只需/code/node_modules,如上所示。

Docker-compose: node_modules not present in a volume after npm install succeeds中已經討論了一個非常類似的問題。

+0

它也有利於把你的搬運工運行命令到YAML文件,然後使用泊塢窗,撰寫啓動它......尤其是當你有很多的體積,當然,一旦你涉及多個集裝箱 –

1

這裏的問題是您正在覆蓋/code文件夾。

請注意,您在構建時正在執行npm install命令,因此創建的映像在/code文件夾中有node_modules文件夾。問題是,在執行docker run命令時,您正在將文件夾掛載在/code文件夾中,因此該文件夾將被本地機器的內容覆蓋。

一種方法可以在npm test命令之前執行npm install

docker run --rm --interactive --tty my-dev-env npm install && npm test 

此外,以命令的執行jasmine正常工作,你將不得不修改package.json如下如下:

"scripts": { 
     "test": "./node_modules/.bin/jasmine" 
    } 
+0

修復此,向下移動你的src一個級別,並掛接(-v'pwd'/src目錄:/代碼/ src目錄),或者將必要的文件夾,以保持成將與圖像數據進行初始化額外的體積( -v /代碼/ node_modules) –

+0

@JesusRT你提到的方法是不是真的我想要什麼,我描述。和'package.json'修改是沒有必要的,因爲故宮源在它運行NPM測試,只是運行給定的命令前殼./node_modules/.bin。但你的診斷是好的,我找到了答案,所以我發佈了它。對不起,我不能upvote你呢:/,謝謝! –