【问题标题】:Installing npm dependencies inside docker and testing from volume在 docker 中安装 npm 依赖项并从卷中进行测试
【发布时间】:2016-12-29 11:43:36
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 将 docker run 命令放入 yaml 文件中,然后使用 docker-compose 启动它也很有帮助……尤其是当您有很多卷并且涉及多个容器时
    【解决方案2】:

    这里的问题是您正在覆盖/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"
        }
    

    【讨论】:

    • 通过将您的 src 向下移动一级并安装它 (-v pwd/src:/code/src) 或将必要的文件夹保存为额外的卷来解决此问题,这些卷将使用图片中的数据(-v /code/node_modules)
    • @JesusRT 正如我所描述的,您提到的方法并不是我真正想要的。并且package.json 修改不是必需的,因为在运行给定命令之前,npm 在运行 npm test 的 shell 中获取 ./node_modules/.bin 。但是你的诊断没问题,我找到了答案,所以我把它贴出来。抱歉,我还不能投票给你:/,谢谢!
    猜你喜欢
    • 1970-01-01
    • 2016-08-02
    • 1970-01-01
    • 2021-11-16
    • 2016-07-26
    • 2016-03-14
    • 2019-03-05
    • 2019-09-14
    相关资源
    最近更新 更多