我想使用Docker为简单的node.js项目创建开发环境。我想在docker容器中安装我的项目依赖项(它们都是npm包)(所以他们不会触摸我的主机)并且仍然使用卷安装我的代码。所以,容器应该能够
在我安装卷的路径中找到node_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"
}
它失败了,因为它无法找到jasmine
,所以它并没有真正安装它:
> jasmine
sh: 1: jasmine: not found
我想用Docker完成我想要的东西吗?另一种方法是全局安装软件包。我也试过npm install -g
无济于事。
我在Debian上使用Docker版本1.12.1,构建23cf638。
答案 0 :(得分:4)
解决方案是将/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已经讨论了一个非常类似的问题。
答案 1 :(得分:2)
这里的问题是您要覆盖/code
文件夹。
请注意,您正在构建时执行npm install
命令,因此创建的图像在/code
文件夹中包含node_modules
文件夹。问题是您在执行/code
命令时正在docker run
文件夹中安装卷,因此该文件夹将被本地计算机的内容覆盖。
一种方法可能是在npm install
命令之前执行npm test
:
docker run --rm --interactive --tty my-dev-env npm install && npm test
此外,为了使命令jasmine
的执行正常,您必须修改package.json
,如下所示:
"scripts": {
"test": "./node_modules/.bin/jasmine"
}