如何在运行" npm install"?时阻止npm创建〜/ .npm目录

时间:2018-02-16 01:29:30

标签: docker npm

我有一个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 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'

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

1 个答案:

答案 0 :(得分:5)

来自the github issue

  

简短的回答是否定的,不可能绕过CLI的缓存。

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

  1. 使用请求的包填充缓存
  2. 从缓存中提取
  3. 鉴于此,您的选择可能会改为:

    1. (作为node用户)npm install && npm cache clean
    2. chown -R "$UID:$GID" node_modules
    3. 另一种选择是以用户身份挂载临时目录(假设TMP_DIR是使用mktmp -d或某种类型制作的):

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

      安装的目录将存在并且将由用户拥有,因此它是可写的。

      另一个选项(因为你根本不关心缓存目录)是将HOME设置为临时目录(其中设置了粘滞位,以便任何人都可以写入:< / p>

          -e HOME=/tmp \