在docker中安装npm依赖关系,并从卷中进行testing

我想使用Docker为简单的node.js项目创build开发环境。 我想在Docker容器中安装我的项目的依赖关系(它们都是npm包),这样他们就不会碰我的主机了,仍然使用一个卷来安装我的代码。 所以,容器应该能够在我装入卷的path上findnode_modules文件夹,但是我不应该从主机上看到它。

这是我的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" } 

它失败了,因为它无法findjasmine ,所以它不是真的安装它:

 > jasmine sh: 1: jasmine: not found 

我可以用Docker完成什么? 另一种方法是在全球安装软件包。 我也尝试npm install -g无济于事。

我在Debian上使用Docker版本1.12.1,编译23cf638。

这里的问题是你正在覆盖/code文件夹。

请注意,您在构build时正在执行npm install命令,因此所创build的映像在/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" } 

解决scheme是也声明/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中已经讨论了一个非常类似的问题:npm安装成功后,node_modules不存在于一个卷中 。