【问题标题】:Docker npm errno -13码头工人 npm errno -13
【发布时间】:2020-10-30 16:06:36
【问题描述】:

我正在 Windows 上的 Docker 2.4.0 上运行一个非常简单的 Node.js Koa “hello world”应用程序。如果基础镜像是node:10-alpine,效果很好:

FROM node:10-alpine
RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
WORKDIR /home/node/app
COPY package*.json ./
USER node
RUN npm install
COPY --chown=node:node . .
EXPOSE 8080
CMD [ "node", "index.js" ]

但是如果我把版本改成FROM node:15.0.1-alpine3.10

Step 6/9 : RUN npm install
 Removing intermediate container 6ff212db1484
 ---> bfde467f103d
Step 6/9 : RUN npm install
 ---> Running in 37ef90ef4039
npm ERR! code EACCES
npm ERR! syscall open
npm ERR! path /home/node/app/package-lock.json
npm ERR! errno -13
npm ERR! Error: EACCES: permission denied, open '/home/node/app/package-lock.json'
npm ERR!  [Error: EACCES: permission denied, open '/home/node/app/package-lock.json'] {
npm ERR!   errno: -13,
npm ERR!   code: 'EACCES',
npm ERR!   syscall: 'open',
npm ERR!   path: '/home/node/app/package-lock.json'
npm ERR! }
........

【问题讨论】:

    标签: docker npm-install


    【解决方案1】:

    npm install 将尝试使用它安装的软件包的当前实际版本更新package-lock.json 文件。对于在 Docker 映像中的安装,您并不真正想要这个;请改用npm ci 来避免这种情况。

    您遇到的另一个问题是 COPY 默认情况下使文件归根用户所有,但您已切换到备用“节点”用户。您可能希望映像中的应用程序代码由 root 拥有,然后以备用用户身份运行:如果存在某种安全问题,这将为您提供额外的保护,防止容器中的代码被修改。

    如果你同时做这两件事,修正后的 Dockerfile 大致如下所示:

    FROM node:15.0.1-alpine3.10
    
    # WORKDIR also creates the directory.  It will be owned by root,
    # which is probably what you want.  (So no `RUN mkdir ...`.)
    WORKDIR /home/node/app
    
    # Stay as the root user for now.
    
    # Install packages:
    COPY package*.json ./
    RUN npm ci             # not `npm install`
    
    # Copy in the rest of the application (still owned by root):
    COPY . .
    
    # Declare runtime metadata.  Only now switch to the "node" user.
    # This will not be able to modify the source code (good).
    USER node
    EXPOSE 8080
    CMD ["node", "index.js"]
    

    【讨论】:

    • 谢谢,辛苦了!最后一个问题。如何在 dockerfile 中更新 npm 版本?当使用 RUN npm install -g npm@latest - 我得到这个错误 EXDEV: cross-device link not allowed, rename '/usr/local/lib/node_modules/npm' -> '/usr/local/lib/node_modules/. npm-i9nnxROI'
    猜你喜欢
    • 1970-01-01
    • 2020-12-20
    • 2020-09-08
    • 2016-03-24
    • 2017-02-01
    • 2016-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多