npm版本位于package.json
。
我有Dockerfile
,简化如下:
FROM NODE:carbon
COPY ./package.json $ {DIR} /
RUN npm install
COPY。 $ {DIR}
RUN npm build
纠正我的理解,
如果./package.json
发生变化,可写泊坞窗图像图层的变化是2还是5?
假设我对npm包依赖项没有任何更改,
我怎么能改变项目版本,但我不希望docker为RUN npm install
重建图像层?
答案 0 :(得分:0)
总而言之,您使用Docker描述的行为是相当标准的(只要package.json
发生更改并且具有不同的哈希值,COPY package.json ./
将再次被驱逐,并且每个后续的Dockerfile命令都会被删除)
因此,Node.js官方文档中概述的docker setup并未缓解此问题,并提出以下Dockerfile:
FROM node:carbon
# Create app directory
WORKDIR /usr/src/app
# Install app dependencies
# A wildcard is used to ensure both package.json AND package-lock.json are copied
# where available (npm@5+)
COPY package*.json ./
RUN npm install
# If you are building your code for production
# RUN npm install --only=production
# Bundle app source
COPY . .
EXPOSE 8080
CMD [ "npm", "start" ]
但是,如果你真的想找到避免在大多数时间从头开始重新运行npm install
的方法,你可以维护两个不同的文件package.json
,比如package-deps.json
,import(并重命名)package-deps.json
并运行npm install
,然后使用正确的package.json
。
如果您想要进行更多检查以确保两个文件的依赖关系不同步,则文件package-lock.json
的角色可能会有所帮助,如果您使用npm 5.8附带的新npm ci
功能(参见相应的changelog),而非使用npm install
。
在这种情况下,由于Docker Hub中最新版本的npm
是npm 5.6,您需要事先升级它。
所有内容放在一起,这个用例可能是Dockerfile
:
FROM node:carbon
# Create app directory
WORKDIR /usr/src/app
# Upgrade npm to have "npm ci" available
RUN npm install -g npm@5.8.0
# Import conf files for dependencies
COPY package-lock.json package-deps.json ./
# Note that this REQUIRES to run the command "npm install --package-lock-only"
# before running "docker build …" and also REQUIRES a "package-deps.json" file
# that is in sync w.r.t. package.json's dependencies
# Install app dependencies
RUN mv package-deps.json package.json && npm ci
# Note that "npm ci" checks that package.json and package-lock.json are in sync
# COPY package.json ./ # subsumed by the following command
COPY . .
EXPOSE 8080
CMD [ "npm", "start" ]
免责声明:我没有在一个真实的例子中尝试上面的解决方案,因为我不是常规节点用户,但您可以将其视为开发阶段的有用解决方案......