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

Installing npm dependencies inside docker and testing from volume

我想使用 Docker 为简单的 node.js 项目创建开发环境。我想在 docker 容器中安装我的项目的依赖项(它们都是 npm 包)(这样它们就不会触及我的主机)并且仍然使用卷挂载我的代码。所以,容器应该能够 在我安装卷的路径中找到 node_modules 文件夹,但我不应该从主机上看到它。

这是我的Docker文件:

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 文件夹。

请注意,您在构建时正在执行 npm install 命令,因此创建的图像在 /code 文件夹和 node_modules 文件夹中。问题是您在执行 docker run 命令时在 /code 文件夹中安装了一个卷,因此该文件夹将被您本地计算机的内容覆盖。

一种方法是在 npm test 命令之前执行 npm install

docker run --rm --interactive --tty my-dev-env npm install && npm test

此外,为了正常执行命令 jasmine,您必须如下修改 package.json

"scripts": {
      "test": "./node_modules/.bin/jasmine"
    }

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