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你呢:/,谢谢! –