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

时间:2016-08-22 19:58:14

标签: node.js docker npm development-environment dependency-management

我想使用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。

2 个答案:

答案 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"
    }