4

我有一个120MB+的node_modules文件夹,我想知道如果node_modules文件夹发生了变化,我们是否可以以某种方式只推送它?

这是我的 docker 文件目前的样子:

FROM node:6.2.0

# Create app directory
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

# Install app dependencies
COPY package.json /usr/src/app/
RUN npm install

# Bundle app source
COPY . /usr/src/app

CMD export NODE_ENV=production

EXPOSE 80:7000
# EXPOSE 7000

CMD [ "npm", "start" ]

所以我想要做的就是只推送node_modules文件夹,如果它已经改变了!我不介意手动指定 node_modules 文件夹何时更改,是否通过传递标志和使用 if 语句来执行此操作,我不知道?

用例:

  1. 我只对我的应用程序代码进行了更改,并没有添加任何新包。
  2. 我添加了一些包并要求推送 node_modules 文件夹。

编辑:

所以我尝试了以下 docker 文件,它引入了一些逻辑

http://bitjudo.com/blog/2014/03/13/building-efficient-dockerfiles-node-dot-js/

当我docker built -t <name> .使用下面的Dockerfile运行时,gcloud docker -- push <url>它仍然会尝试将我的整个目录推送到注册表?!

FROM node:6.2.0

ADD package.json /tmp/package.json
RUN cd /tmp && npm install

# Create app directory
RUN mkdir -p /usr/src/app && cp -a /tmp/node_modules /usr/src/app/
WORKDIR /usr/src/app

# Install app dependencies
# COPY package.json /usr/src/app/
# RUN npm install

# Bundle app source
ADD . /usr/src/app

CMD export NODE_ENV=production

EXPOSE 80:7000
# EXPOSE 7000

CMD [ "npm", "start" ]

运行输出gcloud docker -- push etc...

f614bb7269f3: Pushed
658140f06d81: Layer already exists
be42b5584cbf: Layer already exists
d70c0d3ee1a2: Layer already exists
5f70bf18a086: Layer already exists
d0b030d94fc0: Layer already exists
42d0ce0ecf27: Layer already exists
6ec10d9b4afb: Layer already exists
a80b5871b282: Layer already exists
d2c5e3a8d3d3: Layer already exists
4dcab49015d4: Layer already exists

f614bb7269f3总是被推送,我不知道为什么(Docker 新手)。它试图推送我的应用程序所在的整个目录!?

有任何想法吗?

4

1 回答 1

0

这篇博客文章解释了如何通过创建一个可以缓存的层来缓存您的依赖项,只要 package.json 文件没有更改 - http://bitjudo.com/blog/2014/03/ 13/建筑高效-dockerfiles-node-dot-js/

这是 gist 代码片段的链接 - https://gist.github.com/dweinstein/9468644

在我的组织中为我们的节点应用程序创造了奇迹。

于 2016-11-09T09:41:51.177 回答