代码之家  ›  专栏  ›  技术社区  ›  GG33

在docker中缓存npm包

  •  0
  • GG33  · 技术社区  · 10 月前

    嘿,我是docker和node的新手。我试图对一个简单的节点api进行dockerize。 这是我的docker文件:

    WORKDIR app
    EXPOSE 3000
    ENV NODE_ENV=production
    COPY package.json package-lock.json ./
    RUN \
        --mount=type=cache,target=~/.npm\
        npm ci --only-production
    USER node
    COPY --chown=node:node /src .
    CMD [ "npm" , "run" , "dev"]
    

    据我所知,当我试图添加缓存装载时,我产生了怀疑和问题 我需要找到npm缓存其包的位置,这样我就可以将缓存挂载到该位置,以便npm能够找到它们,这样它就不会重新下载它们。起初,用户是root,所以我会将缓存挂载到/root/.npm(~这里将是root home),但当我切换到节点user并运行npm run时,它将无法找到缓存的依赖项,因为home已经更改(它将变为/home/node)。

    每当我出于安全目的切换用户时,我真的会对这类事情感到困惑,所以任何澄清都将不胜感激。

    1 回复  |  直到 10 月前
        1
  •  1
  •   David Maze    10 月前

    A. RUN --mount 选项仅适用于特定 RUN 命令打开。一旦打开 奔跑 命令完成后,装载将被删除。

    这意味着您只需要在运行命令时,为任何正确的目录上下文提供正确的装载路径。如果主目录是 /root 当你运行那个命令时,硬编码是正确的

    RUN --mount=type=cache,target=/root/.npm \
        npm ci --only-production
    

    当您运行应用程序时,它将使用本地 node_modules 目录,它根本不会查看此缓存目录。

    (这是正确的 节点模块 由root拥有,文件通常是全球可读的,但不是全球可写的。我可能也会删除 COPY --chown 选项将相同的权限应用于源代码,防止其被意外覆盖。)