【问题标题】:Docker with yarn码头工人与纱线
【发布时间】:2017-11-10 17:23:19
【问题描述】:

第一次尝试让 yarn 和 docker 一起工作。 每次运行 docker build 命令时,如何阻止 yarn 安装软件包?

我找到了一些解决方案,例如将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 照常运行,每次都获取包。

【问题讨论】:

  • 您是否考虑过在您的设置中使用.dockerignore 文件?
  • @DanielD 有关该方法的更多详细信息吗?
  • 看看这个:docs.docker.com/engine/reference/builder/#dockerignore-file。这也许可以帮助你。这类似于使用.gitignore 文件。如果看起来有帮助,我会写一个快速答案以供将来使用。
  • 它所做的是在添加文件时排除文件。我没有将node_modules 添加到docker 中,它们是由yarn install 生成的。
  • 你的Dockerfile有什么?

标签: docker docker-compose yarnpkg


【解决方案1】:

一定要注意 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

.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

【讨论】:

    【解决方案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 文件中

    【讨论】:

      猜你喜欢
      • 2018-11-11
      • 1970-01-01
      • 1970-01-01
      • 2017-02-01
      • 2016-01-18
      • 1970-01-01
      • 2018-07-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多