当我运行“ npm install”时,如何防止npm创建〜/ .npm目录?

Nat*_*man 4 npm docker

我有一个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
Run Code Online (Sandbox Code Playgroud)

注意:通过覆盖用户和组ID,我可以确保创建的文件npm install具有正确的所有权,从而允许当前用户make clean随后运行。

npm install调用试图创建~/.npm。但是,如果当前用户和组ID node与容器中用户的ID不匹配,那么我将得到一个错误:

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

如果可能的话,我想npm跳过整个创建过程/home/node/.npm。是否有阻止创建此目录的标志?容器是临时的,因此保留目录的内容没有任何价值。

Ant*_*ile 6

github的问题

简短的答案是“否”,不可能绕过CLI的缓存。

基本上,npm安装实质上是:

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

挂载的目录将存在,并将归用户所有,因此可写。

另一个选择(因为您实际上根本不在乎缓存目录)是设置HOME为临时目录(设置了粘性位,因此任何人都可以写):

    -e HOME=/tmp \
Run Code Online (Sandbox Code Playgroud)

  • 谢谢详细的解释。我特别喜欢最后一个选项(使用`/tmp`)——我想我会走那条路。 (2认同)