我想使用 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。
最佳答案
解决方案是还将 /code/node_modules
声明为一个卷,只是不将其绑定(bind)安装到主机中的任何目录。像这样:
docker run --rm --interactive --tty --volume /code/node_modules --volume $(pwd):/code my-dev-env npm test
正如@JesusRT 所指出的,npm install
工作得很好,但是绑定(bind)安装 $(pwd)
到 /code
单独是阴影图像中 /code
的现有内容。我们可以通过将容器中的 /code
声明为数据卷来恢复我们想要的任何内容——在本例中,只是 /code/node_modules
,如上所示。
Docker-compose: node_modules not present in a volume after npm install succeeds 中已经讨论了一个非常相似的问题.
关于node.js - 在 docker 中安装 npm 依赖项并从 volume 进行测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39087727/