gpt4 book ai didi

docker - 构建容器时如何制作yarn缓存模块?

转载 作者:行者123 更新时间:2023-12-04 16:25:17 30 4
gpt4 key购买 nike

这是我的 Dockerfile本地开发:

FROM node:12-alpine

WORKDIR /usr/app

ENV __DEV__ 1

COPY package.json ./
COPY yarn.lock ./
RUN yarn --frozen-lockfile

COPY tsconfig.json ./
COPY nodemon.json ./

RUN apk add --no-cache tini
ENTRYPOINT ["/sbin/tini", "--"]

CMD [ "yarn", "dev" ]

这就是我构建它的方式:
docker build --rm -f Dockerfile.dev --tag my-app .
这是我运行它的方式:
docker run --rm -it --volume $(pwd)/src:/usr/app/src -p 3000:3000 my-app
只有在 src 之外的东西时,我才需要构建它文件夹更改。例如,当我安装节点模块时。如何制作 yarn在某处缓存模块,因此它不会在每次构建时拉取所有模块。

最佳答案

下一代使用 Docker 构建容器正在使用 Buildkit .我推荐使用它,特别是因为它有一个优雅的缓存问题解决方案。目前在 vanilla Docker 中确实没有很好的解决方案;虽然您可以解决它,但它非常麻烦。
我将在这里列出这两种解决方案:
使用 Buildkit
Tarun's answer是在正确的轨道上,但有一种更清洁的方法。 Buildkit 支持 specifying a mount as a cache .一旦您拥有 set up Docker to use Buildkit ,我们需要做的就是:

...
RUN --mount=type=cache,target=/root/.yarn YARN_CACHE_FOLDER=/root/.yarn yarn install
...
如果它不存在或已过期,这将自动拉入上一次运行的缓存或创建它。就这么简单。
Vanilla docker
或者,如果使用 Buildkit 不是一种选择,您可以使用 vanilla Docker。我们在这里可以做的最好的事情是使用 COPY指令复制到位于构建上下文中的某种“缓存”。例如,如果我们创建一个目录 .yarn_cache在构建上下文的根目录中,我们可以提供一个缓存:
...
COPY .yarn_cache /root/.yarn
RUN yarn --frozen-lockfile
...
此外部缓存将 不是 在构建镜像时进行更新,并且需要在镜像之外进行初始化和定期更新。您可以使用以下 shell 命令执行此操作(在第一次运行时清除所有本地 node_modules 以强制它预热缓存):
$ YARN_CACHE_FOLDER=.yarn_cache yarn install
现在虽然这有效,但它非常hack-y并且有一些缺点:
  • 您需要手动创建和更新缓存。
  • 整个.yarn_cache目录需要包含在构建上下文中,这可能非常慢,更不用说它必须在每次构建时都这样做,即使什么都没有改变。

  • 由于这些原因,前一种解决方案是首选。

    奖金专业提示:在上述任何一种情况下都包含 yarn 缓存仍将其保留在最终图像中,从而增加其大小。如果您使用多阶段构建,则可以缓解此问题:
    # syntax = docker/dockerfile:1.2
    FROM node:12-alpine as BUILDER

    WORKDIR /usr/app

    COPY package.json ./
    COPY yarn.lock ./
    RUN --mount=type=cache,target=/root/.yarn YARN_CACHE_FOLDER=/root/.yarn yarn --frozen-lockfile


    FROM node:12-alpine

    WORKDIR /usr/app

    COPY --from=BUILDER node_modules ./node_modules


    COPY package.json ./
    COPY yarn.lock ./
    COPY tsconfig.json ./
    COPY nodemon.json ./

    RUN apk add --no-cache tini
    ENTRYPOINT [ "/sbin/tini", "--" ]

    ENV __DEV__=1

    CMD [ "yarn", "dev" ]

    关于docker - 构建容器时如何制作yarn缓存模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65913706/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com