在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不存在于一个卷中 。