如何防止运行“npm install”时npm创建~/.npm目录?

5

我有一个Vue.js项目,我正在尝试使用node:latest容器在Docker中构建它。这是我的Makefile中安装项目所需包的相关行:

CWD = $(shell pwd)
UID = $(shell id -u)
GID = $(shell id -g)

# ...

sometarget:
    docker run \
        --rm \
        -e HOME=/home/node \
        -u ${UID}:${GID} \
        -v ${CWD}:/usr/src/app \
        -w /usr/src/ui \
        node:latest \
        npm install

注意:通过覆盖用户和组ID,我可以确保由npm install创建的文件具有正确的所有权,使得当前用户可以在之后运行make cleannpm install调用尝试创建~/.npm。然而,如果当前用户和组ID与容器中的node用户不匹配,则会出现错误。
npm ERR! path /home/node/.npm
npm ERR! code EACCES
npm ERR! errno -13
npm ERR! syscall mkdir
npm ERR! Error: EACCES: permission denied, mkdir '/home/node/.npm'

我希望如果可能的话,npm可以完全跳过创建/home/node/.npm目录。是否有一个标志可以防止创建此目录?容器是短暂的,因此保留目录内容没有任何价值。

作为另一种选择,将该命令以用户“node”的身份运行怎么样? - zero298
@zero298 如果我使用 node 命令运行,则由该命令创建的文件将具有不同的用户/组 ID,主机用户将无法编写/删除它们。 - Nathan Osman
1个回答

7

这是从GitHub问题中得出的答案:

简而言之,不可以绕过CLI的缓存。

基本上,npm install的过程如下:

  1. 填充请求的软件包到缓存中
  2. 从缓存中提取

因此,您的选择可能会更改为:

  1. (作为node用户)npm install && npm cache clean
  2. chown -R "$UID:$GID" node_modules

另一个选择是将临时目录挂载为用户(假定TMP_DIR是使用mktmp -d或某种方式创建的):

    -v $TMP_DIR:/home/node \
    -e HOME=/home/node \

挂载的目录将存在并且由用户拥有,因此它是可写的。
另一个选项(因为你实际上根本不关心缓存目录)是将HOME设置为临时目录(具有粘着位,因此任何人都可以写入:
    -e HOME=/tmp \

2
感谢详细的解释。我特别喜欢最后一种选项(使用 /tmp)- 我想我会选择这条路。 - Nathan Osman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接