【问题标题】:npm package.json and docker (mounting it...)npm package.json 和 docker(安装它...)
【发布时间】:2016-04-14 09:35:13
【问题描述】:

我正在使用 Docker,所以这个案例可能看起来很奇怪。但我希望在开发时将整个/data 目录安装在我的 docker 容器中。

我的/data 文件夹容器我的package.json 文件、app 目录和一堆其他东西。 问题是我希望我的node_modules 文件夹不是持久的,只有package.json 文件。

我已经尝试了几件事,但package.jsonnpm 让我很难过...

  • 直接挂载package.json 文件会破坏npm。 npm 尝试在保存时重命名文件,这在挂载文件时是不可能的。
  • 挂载父文件夹 (/data) 将挂载 node_modules 文件夹。
  • 我找不到任何配置选项可以将 node_modules 放在 /data 之外的另一个文件夹中,例如 /dist
  • package.json 放入/data/conf/data/conf 安装为卷将不起作用。我找不到在npmrc 中指定package.json 路径的任何方法。
  • package.json 放入/data/conf 并将其符号链接到/data/package.json 将不起作用。 npm 断开符号链接并将其替换为文件。

在 docker 容器内部来回复制数据是我现在的做法。有点乏味。我还想要一个干净的解决方案。

【问题讨论】:

  • 这是一个笨重的工具,但是unionfs覆盖不能解决你的问题吗?
  • 由于文件作为容器内的挂载点可见,所以没关系。它无法重命名(替换)文件,因为替换后它将与挂载点断开连接..
  • 我通过使用全局安装路径来做到这一点:saulshanabrook.com/npm-docker-sharing-volumes

标签: node.js npm docker


【解决方案1】:

正如您已经回答的那样,我认为这可能是目前唯一的解决方案。

在构建 Docker 映像时,请执行以下操作:

COPY data/package.json /data/
RUN mkdir /dist/node_modules && ln -s /dist/node_modules /data/node_modules && cd /data && npm install

对于其他东西(比如凉亭,做同样的事情)

COPY data/.bowerrc /data/
COPY data/bower.json /data/
RUN mkdir /dist/vendor && ln -s /dist/vendor /data/vendor && cd /data && bower install --allow-root

最后是COPY data/ /data(因此当data 发生更改时,您可以使用 Dockers 缓存而不必安装 npm/docker。

您还需要创建所需的符号链接并将它们存储在您的 git-repo 中。它们在外部无效,但很可能在您的容器内部起作用。

使用此解决方案,您可以挂载您的$PWD/data:/data,而无需将 npm/bower “垃圾”放在容器外。而且您仍然可以将映像构建为服务的独立部署。

【讨论】:

    【解决方案2】:

    一种类似的替代方法是使用 NODE_ENV 变量而不是创建符号链接。

    RUN mkdir -p /dist/node_modules RUN cp -r node_modules/* /dist/node_modules/ ENV NODE_PATH /dist/node_modules

    在这里,您首先为 node_modules 创建一个新目录,将所有模块复制到那里,然后让 Node 从那里读取模块。

    【讨论】:

      【解决方案3】:

      这个问题我已经有一段时间了,接受的解决方案对我不起作用*

      我发现了这个link,它有一个编辑指向here,这确实对我有用:

      volumes:
        - ./:/data
        - /data/node_modules
      

      在这种情况下,引擎会创建一个未安装到您的源目录的卷(请参阅volumes 上的Compose reference)。这是最简单的解决方案,不需要我进行任何符号链接、设置路径等操作。

      作为参考,我的简单 Dockerfile 如下所示:

      # install node requirements
      WORKDIR /data
      COPY ./package.json ./package.json
      RUN npm install -qq
      
      # add source code
      COPY ./ ./
      
      # run watch script
      CMD npm run watch
      

      watch 脚​​本就是 webpack --watch -d

      希望这能够帮助某人并像我一样节省数小时的时间!


      '*' = 我无法让webpack 从我的package.json 脚本中工作并安装任何东西,而在容器内使用我刚刚安装的任何东西创建了node_modules 文件夹(我从容器内部运行npm i --save [packages] 以获得软件包更新package.json 直到下一次重建)

      【讨论】:

        【解决方案4】:

        我采用的解决方案是将 node_modules 文件夹放在 /dist/node_modules 中,并从 /data/node_modules 建立一个符号链接。我可以在我的 Dockerfile 中执行此操作,以便在构建时使用它,并且我可以将我的符号链接提交到我的 git-repo。一切都很顺利..

        【讨论】:

          【解决方案5】:

          也许你可以保存你的容器,然后用一个最小的 dockerfile 定期重建它

          来自我的容器

          和一个 .dockerignore 文件包含

          /data/node_modules

          查看文档 http://docs.docker.com/reference/builder/#the-dockerignore-file

          【讨论】:

          • 在开发过程中,当有很多变化并使用 fig 来启动环境时,这不是一个好的解决方案。唯一的问题是这个 package.json 文件,其他都没有。这个解决方案也会使一切复杂化很多..
          猜你喜欢
          • 2011-08-24
          • 1970-01-01
          • 2014-02-08
          • 2018-12-25
          • 2021-06-21
          • 1970-01-01
          • 2014-03-20
          • 2013-02-25
          • 2016-08-02
          相关资源
          最近更新 更多