Ran*_*els 5 development-environment dependency-management node.js npm docker
我想使用Docker为一个简单的node.js项目创建开发环境。我想将项目的依赖项(它们都是npm软件包)安装在docker容器内(这样它们就不会碰到我的主机),并且仍然使用卷挂载我的代码。因此,容器应该能够node_modules在安装卷的路径中找到该文件夹,但是我不应该从主机上看到它。
这是我的Dockerfile:
FROM node:6
RUN mkdir /code
COPY package.json /code/package.json
WORKDIR /code
RUN npm install
Run Code Online (Sandbox Code Playgroud)
这是我的运行方式:
docker build --tag my-dev-env .
docker run --rm --interactive --tty --volume $(pwd):/code my-dev-env npm test
Run Code Online (Sandbox Code Playgroud)
这是我的package.json:
{
"private": true,
"name": "my-project",
"version": "0.0.0",
"description": "My project",
"scripts": {
"test": "jasmine"
},
"devDependencies": {
"jasmine": "2.4"
},
"license": "MIT"
}
Run Code Online (Sandbox Code Playgroud)
它失败了,因为它找不到jasmine,因此它并不是真正的安装它:
> jasmine
sh: 1: jasmine: not found
Run Code Online (Sandbox Code Playgroud)
Docker可以实现我想要的功能吗?一种替代方法是全局安装软件包。我也试图npm install -g无济于事。
我使用的是Docker 1.12.1版本的Debian,版本23cf638。
解决方案是也声明/code/node_modules为卷,只是不将其绑定挂载到主机中的任何目录。像这样:
docker run --rm --interactive --tty --volume /code/node_modules --volume $(pwd):/code my-dev-env npm test
Run Code Online (Sandbox Code Playgroud)
正如@JesusRT 所指出的那样,npm install工作正常,但单独绑定安装$(pwd)会/code遮蔽/code图像中的现有内容。我们可以/code通过将容器声明为数据卷来从容器中恢复我们想要的任何内容——在这种情况下,只是/code/node_modules,如上所示。
在Docker-compose: node_modules not present in a volume after npm install successfully 中已经讨论了一个非常相似的问题。