如何在docker中安装全局模块?

loc*_*ton 5 npm docker

Error: EACCES: permission denied, open '/usr/local/lib/node_modules尝试在docker中安装全局模块时获取:

FROM node:latest
RUN mkdir -p /code
RUN npm i -g npm
WORKDIR /code

RUN npm set progress=false &&  npm install -g exp
Run Code Online (Sandbox Code Playgroud)

node的官方文档中https://forums.docker.com/中没有关于此的信息。

Bla*_*ise 6

出于安全原因,默认情况下,Npm不允许以root用户身份运行。当您以root身份运行npm(这是Docker构建中的默认用户)并安装全局软件包时,npm会以nobody没有任何权限的用户身份安装并执行二进制文件。

您可以通过添加--unsafe-perm标志来避免这种情况:

RUN npm install --global --unsafe-perm exp
Run Code Online (Sandbox Code Playgroud)

或通过将全局用户显式设置为root

RUN npm --global config set user root && \
    npm --global install exp
Run Code Online (Sandbox Code Playgroud)

资源

或在docker构建期间切换到非root 用户。请注意,这将影响容器中文件的所有权。

USER指令设置运行映像时要使用的用户名(或UID)以及可选的用户组(或GID),以及Dockerfile中跟随该映像的所有RUN,CMD和ENTRYPOINT指令。


tep*_*hyr 6

根据当前的 docker-node 文档,您可以通过将以下行添加到 Dockerfile 来将全局 npm 依赖项的位置设置为用户可写的位置:

ENV NPM_CONFIG_PREFIX=/home/node/.npm-global

# optionally if you want to run npm global bin without specifying path
ENV PATH=$PATH:/home/node/.npm-global/bin
Run Code Online (Sandbox Code Playgroud)