第一次尝试让纱线和码头工人一起工作。
如何在每次运行docker build
命令时阻止纱线安装包?
我找到了一些解决方案,比如将node_modules
存储在一个临时目录中,然后将其链接,但是安装了各种软件包后,我会遇到太多错误。有没有办法将我的yarn.lock
与Docker中存在的一个或任何其他解决方案进行比较?
Dockerfile:
FROM node:8.9.1-alpine
COPY package.json yarn.lock /usr/src/
RUN cd /usr/src \
&& yarn install --pure-lockfile
COPY . /usr/src
EXPOSE 3005
通过此设置,我收到一条消息Sending build context to Docker daemon 375.2MB
,然后yarn install
正常运行,每次都会提取包。
答案 0 :(得分:4)
绝对要注意docker缓存。基本上你想要比不稳定的指令更早地运行最稳定的指令。不应重新运行导致与早期运行相同的图像更改的指令(排除ENV / ARG指令的问题)。但是一旦需要运行指令,无论缓存中的内容是什么,都将运行以下所有指令。
.dockerignore也会有所帮助,但事情很容易进入。我采用了忽略所有内容然后确定应该复制的内容来反转文件的做法。
为了最大限度地减少从网上抓取,我喜欢使用纱线离线缓存。这将存储已安装依赖项的tarball,并将其重新用于将来的安装。每次都可以获得超过npm rebuild
全新安装的好处(如果缓存已失效)。您可以使用.yarnrc文件配置脱机缓存,该文件可能位于您的主目录中,但为此您可以在repo中保留一个以及存储tarball的目录。
您可以选择将镜像目录签入您的仓库。典型的大型npm模块安装仍然只能在20兆的范围内。
如果您使用下面的文件,根据您的需求进行自定义,并在本地运行yarn
,则yarn-offline-mirror将包含安装该应用程序所需的tarball。
.dockerignore
*
!yarn-offline-mirror/
!src/
!package.json
!yarn.lock
!.yarnrc
.yarnrc
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
yarn-offline-mirror "./yarn-offline-mirror"
Dockerfile
ENV HOME /usr/src/
WORKDIR $HOME
# copy the tarballs
COPY ["yarn-offline-mirror", "$HOME/yarn-offline-mirror/"]
# copy files needed for the install
COPY ["package.json", "yarn.lock", ".yarnrc", "$HOME/"]
# the offline flag will mean that an error is raised if any
# module needs to be fetched remotely. It can be removed to allow
# yarn to fetch any missing modules if that was to happen.
RUN yarn --offline --frozen-lockfile --link-duplicates
# copy the rest.. could be further broken up into multiple instructions
# for cache optimisation
COPY . $HOME
CMD npm start
答案 1 :(得分:2)
您应该更好地使用docker缓存。
如果您的Dockerfile准备如下:
FROM node:carbon
COPY package.json yarn.lock /app
RUN cd /app \
&& yarn install --pure-lockfile
COPY . /app
CMD doStuff
docker build
除非发生变化,否则不会触及package.json
。除非在前面的步骤中缓存已失效,否则下一个RUN命令不会执行。
注意:将node_modules
保留在.dockerignore
文件