npm package.json和docker(挂载......)

时间:2014-11-05 12:30:23

标签: node.js npm docker

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

我的/data文件夹容器my 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作为卷安装,而不是工作。我无法找到在package.json中指定npmrc路径的方法。
  • package.json放入/data/conf并将其符号化为/data/package.json将无效。 npm打破符号链接并用文件替换它。

在docker容器内来回传输数据是我现在正在做的事情..有点乏味......我也想要一个干净的解决方案..

5 个答案:

答案 0 :(得分:7)

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

在构建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“垃圾”。您仍然可以将您的映像构建为服务的独立部署..

答案 1 :(得分:5)

一种类似的替代方法是使用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从那里读取模块。

答案 2 :(得分:5)

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

我找到了这个link,其编辑指向here,这确实对我有用:

@Html.DropDownListFor(model => model.EmployeeID,(IEnumerable<SelectListItem>)ViewData["EmployeeName"])

在这种情况下,引擎会创建一个未安装到源目录的卷(请参阅volumes: - ./:/data - /data/node_modules 上的Compose reference)。这是最简单的解决方案,并没有要求我做任何符号链接,设置路径等。

作为参考,我的简单Dockerfile看起来像这样:

volumes

# 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

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

<小时/> &#39; *&#39; =我无法从我的webpack --watch -d脚本中获取webpack并在容器内部安装任何内容时创建package.json文件夹以及我刚安装的任何内容(我运行{{1} }从容器内部获取包更新node_modules直到下一次重建

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

FROM my_container

和包含

的.dockerignore文件

/数据/ node_modules

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