2014-11-05 245 views
8

我正在使用Docker,因此这种情况可能看起来很奇怪。但是我希望我的整个/data目录在开发时安装在我的Docker容器中。npm package.json和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打破了符号链接并用文件替换它。

复制数据来回/从泊坞窗内的容器就是我正在做它现在..有点乏味。我也希望有一个干净的解决方案..

+0

这是一个笨手笨脚的工具,但会unionfs覆盖不能解决你的问题? – Wrikken 2014-11-07 13:44:50

+0

由于该文件作为容器内的安装点可见,因此它很重要。它无法重命名(替换)该文件,因为替换后它将从挂载点断开。 – xeor 2014-11-07 20:49:51

+0

我通过使用全局安装路径完成了此操作:http://www.saulshanabrook.com/npm-docker-sharing -volumes/ – 2015-10-09 15:15:36

回答

7

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

当你建立你的码头工人的形象,做这样的事情:

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

0

也许你可以节省您的容器,然后定期用最小dockerfile重建它

FROM my_container

和含有

/数据的.dockerignore文件/ node_modules

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

+1

在一个开发人员面前,当有很多变化并且使用无花果来启动env时,这不是一个好的解决方案。唯一的问题是这个package.json文件,其他都没有。这种解决方案也会使所有事情变得复杂。 – xeor 2014-11-07 20:48:19

1

我是把在/dist/node_modules的node_modules文件夹,并从/data/node_modules作出一个符号链接到它去解决方案。我可以在我的Dockerfile中做到这一点,所以它将在构建时使用它,并且我可以将我的符号链接提交给我的git-repo。一切都很好...

4

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

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

在这里,你首先要建立node_modules一个新的目录,复制所有模块存在,并有节点从那里读模块。

+0

如果我们需要运行'grunt'命令,它将无法工作。 – lvarayut 2015-11-19 06:38:27

3

现在我已经有这个问题了一段时间,和接受的解决方案并没有为我工作*

我发现这个link,其中有指向here编辑,这确实为我工作:

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

在这种情况下,发动机会创建一个卷(见volumesCompose 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直到下一次重建)