nodejs项目的版本控制并使用最小的图像差异对其进行docker化

时间:2018-04-14 09:27:25

标签: docker dockerfile docker-image

npm版本位于package.json

我有Dockerfile,简化如下:

  1. FROM NODE:carbon

  2. COPY ./package.json $ {DIR} /

  3. RUN npm install

  4. COPY。 $ {DIR}

  5. RUN npm build

  6. 纠正我的理解,

    如果./package.json发生变化,可写泊坞窗图像图层的变化是2还是5?

    假设我对npm包依赖项没有任何更改, 我怎么能改变项目版本,但我不希望docker为RUN npm install重建图像层?

1 个答案:

答案 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" ]

免责声明:我没有在一个真实的例子中尝试上面的解决方案,因为我不是常规节点用户,但您可以将其视为开发阶段的有用解决方案......