当前位置: 首页 > 面试题库 >

在Docker构建Dockerfile时如何缓存RUN npm安装指令

翟理
2023-03-14
问题内容

我目前正在为我的应用程序开发Node后端。在对其进行docker化(docker build)时,最长的阶段是RUN npm install。该RUN npm install指令在每个小的服务器代码更改上运行,通过使开发人员每次等待构建完成来影响生产率。

我发现在应用程序代码所在的位置运行npm
install并使用ADD指令将node_modules添加到容器中可以解决此问题,但这远非最佳实践。这有点破坏了将其Docker化的整个想法,并且使容器的重量增加了很多。

还有其他解决方案吗?


问题答案:

好的,所以我发现了这篇有关写docker文件时效率的精彩文章。

这是一个错误的docker文件在运行RUN npm install指令之前添加应用程序代码的示例:

FROM ubuntu

RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list
RUN apt-get update
RUN apt-get -y install python-software-properties git build-essential
RUN add-apt-repository -y ppa:chris-lea/node.js
RUN apt-get update
RUN apt-get -y install nodejs

WORKDIR /opt/app

COPY . /opt/app
RUN npm install
EXPOSE 3001

CMD ["node", "server.js"]

通过将应用程序的副本分成2个COPY指令(一个用于package.json文件,另一个用于其余文件)并在添加实际代码之前运行npm
install指令,任何代码更改都不会触发RUN npm install指令,只有package.json的更改才会触发它。更好地实践docker文件:

FROM ubuntu
MAINTAINER David Weinstein <david@bitjudo.com>

# install our dependencies and nodejs
RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list
RUN apt-get update
RUN apt-get -y install python-software-properties git build-essential
RUN add-apt-repository -y ppa:chris-lea/node.js
RUN apt-get update
RUN apt-get -y install nodejs

# use changes to package.json to force Docker not to use the cache
# when we change our application's nodejs dependencies:
COPY package.json /tmp/package.json
RUN cd /tmp && npm install
RUN mkdir -p /opt/app && cp -a /tmp/node_modules /opt/app/

# From here we load our application's code in, therefore the previous docker
# "layer" thats been cached will be used if possible
WORKDIR /opt/app
COPY . /opt/app

EXPOSE 3000

CMD ["node", "server.js"]

这是package.json文件的添加位置,安装其依赖项并将其复制到应用程序所在的容器WORKDIR中:

ADD package.json /tmp/package.json
RUN cd /tmp && npm install
RUN mkdir -p /opt/app && cp -a /tmp/node_modules /opt/app/

为了避免每个docker构建上的npm安装阶段,只需复制这些行并将^ / opt / app ^更改为您的应用在容器中的位置。



 类似资料:
  • 问题内容: 我目前正在为我的应用程序开发Node后端。在对其进行Docker化(docker build。)时,最长的阶段是。该指令在每个小的服务器代码更改上运行,通过使开发人员每次都等待构建完成来影响生产率。 我发现在应用程序代码所在的位置运行npm install并使用ADD指令将node_modules添加到容器中可以解决此问题,但这远非最佳实践。这有点破坏了将其Docker化的整个想法,并

  • 笔者想通过jenkins实现一个简单的自动化部署,目前我的操作如下 在工程文件下面新建了dockerfile文件,通过多阶段构建来利用缓存提高构建速度 在jenkins构建时编写了脚本,主要操作就是删除上一次构建的容器和镜像文件,重写构建一个新的镜像和容器 但是有一个问题就是删除了上一次的镜像和容器docker的缓存是不是就是不在了,无法利用缓存来提高构建速度,如果我想利用dockerfile的缓

  • 问题内容: 在我中,我使用或下载档案的最新版本,例如: 使用或创建自己的图像层的语句。它将用作以后执行的缓存。 问题 :如何禁用该指令的缓存? 让类似 缓存失效的 东西在那里工作会很棒。例如,通过使用HTTP ETag 或查询 最后修改的 标头字段。这样就可以根据HTTP标头进行快速检查,以决定是否可以使用缓存的层。 我知道一些肮脏的技巧可以帮助例如在语句中执行下载Shell脚本。在我们的构建系统

  • 我正试图建立一个H2o docker的形象,使用https://github.com/h2oai/h2o-3/blob/master/Dockerfile. 它会出现以下错误: E:包'oracle-java8-install er'没有安装候选 命令“/bin/sh-c echo”DPkg::Post Invoke{/bin/rm-f/var/cache/apt/archives/.deb |

  • 问题内容: 我对Docker的层缓存表现出色感到惊讶,但我也想知道它如何确定是否可以使用缓存的层。 让我们以这些构建步骤为例: 例如,它如何知道可以使用缓存的层,但可以为其创建新层呢? 问题答案: 在Dockerfile最佳实践构建缓存部分中相当详尽地解释了构建缓存过程。 * 从缓存中已存在的基本映像开始,将下一条指令与从该基本映像派生的所有子映像进行比较,以查看是否其中一个是使用完全相同的指令构

  • 我一直在阅读docs编写Dockerfiles的最佳实践。我遇到了小错误(IMHO),在进一步阅读后,其含义很清楚: 在RUN语句中单独使用apt-get更新会导致缓存问题和后续apt-get安装指令失败。 我想知道为什么失败。后来解释了他们所说的“失败”是什么意思: 由于apt get更新未运行,您的构建可能会获得过时版本的curl和nginx包。 但是,对于以下内容,我仍然无法理解他们所说的“