带纱线的 Docker

Anc*_*nek 8 docker docker-compose yarnpkg

第一次尝试让 yarn 和 docker 一起工作。每次运行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
Run Code Online (Sandbox Code Playgroud)

通过此设置,我收到一条消息Sending build context to Docker daemon 375.2MB,然后yarn install像往常一样运行,每次都获取包。

lec*_*tor 10

一定要注意docker缓存。基本上,您希望比不太稳定的指令更早地运行最稳定的指令。不应重新运行会导致与先前运行相同的图像更改的指令(不包括 ENV/ARG 指令的问题)。但是一旦确实需要运行一条指令,无论缓存中有什么,后面的所有指令都将运行。

.dockerignore 也有帮助,但很容易让事情溜进来。我采用了通过忽略所有内容然后准确指定应该复制的内容来反转文件的做法。

为了尽量减少从网络上获取数据,我喜欢使用 yarn 离线缓存。这会存储已安装依赖项的 tarball,并在以后的安装中重用它们。您npm rebuild每次都可以从全新安装中受益(如果缓存已失效)。您可以使用 .yarnrc 文件配置离线缓存,该文件可能位于您的主目录中,但为此目的,您将一个文件与一个用于存储 tarball 的目录一起保存在您的存储库中。

您可以选择将镜像目录签入到您的存储库中。一个典型的大型 npm 模块安装仍然只会在 20 兆左右。

如果您使用以下文件,根据您的需要进行自定义并在yarn本地运行,则 yarn-offline-mirror 将包含安装应用程序所需的 tarball。

.dockerignore

*

!yarn-offline-mirror/
!src/
!package.json
!yarn.lock
!.yarnrc
Run Code Online (Sandbox Code Playgroud)

.yarnrc

# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1

yarn-offline-mirror "./yarn-offline-mirror"
Run Code Online (Sandbox Code Playgroud)

文件

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
Run Code Online (Sandbox Code Playgroud)


Ste*_*ano 6

您应该更好地使用 docker 缓存。

如果您按如下方式准备了 Dockerfile:

FROM node:carbon

COPY package.json yarn.lock /app
RUN cd /app \
    && yarn install --pure-lockfile

COPY . /app
CMD doStuff
Run Code Online (Sandbox Code Playgroud)

docker build不会接触package.json,除非它已经改变了。除非缓存在前面的步骤中无效,否则下一个 RUN 命令不会执行。

注意:保留node_modules在你的.dockerignore文件里面