码头用纱线

时间:2017-11-10 17:23:20

标签: docker docker-compose yarn

第一次尝试让纱线和码头工人一起工作。 如何在每次运行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正常运行,每次都会提取包。

2 个答案:

答案 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文件