在docker内部安装npm依赖项并从卷进行测试

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。

Ran*_*els 5

解决方案是也声明/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 中已经讨论了一个非常相似的问题。