簡體   English   中英

(EACCES: permission denied, mkdir '/usr/app/node_modules/.cache) 如何創建一個 docker-compose 文件來使 node_modules 成為非根文件夾?

[英](EACCES: permission denied, mkdir '/usr/app/node_modules/.cache) How can I create a docker-compose file to make node_modules a non-root folder?

我正在嘗試 dockerize 一個簡單的 create-react-app 項目。 是運行npx create-react-app test后的初始項目,沒有文件被更改)。

問題似乎是在較新版本的React中,他們將惱人的.eslintcache從根文件夾移動到/node_modules/.cache ,當容器試圖通過docker-compose運行應用程序時會導致問題。

Dockerfile

FROM node:alpine

WORKDIR /usr/app

COPY package*.json ./

RUN npm install

RUN chown -R node.node /usr/app/node_modules

COPY . ./

CMD ["npm", "start"]

docker-compose

version: '3'
services: 
  test:
    stdin_open: true
    build:
      context: .
      dockerfile: Dockerfile
    environment:
      - CHOKIDAR_USEPOLLING=true
    volumes:
      - /usr/app/node_modules
      - .:/usr/app
    ports:
      - '3000:3000'

容器正在記錄此錯誤消息:

test_1   | Failed to compile.
test_1   | 
test_1   | EACCES: permission denied, mkdir '/usr/app/node_modules/.cache

如您所見,我嘗試將node_modules文件夾所有者設置為節點用戶( node:alpine的默認用戶),但它不起作用; 瀏覽容器,您可以看到node_modules文件夾仍然由root擁有:

drwxrwxr-x    5 node     node          4096 Apr 14 07:04 .
drwxr-xr-x    1 root     root          4096 Apr 14 07:08 ..
-rw-rw-r--    1 node     node           310 Apr 14 06:56 .gitignore
-rw-rw-r--    1 node     node           192 Apr 14 07:30 Dockerfile
-rw-rw-r--    1 node     node          3369 Apr 14 06:56 README.md
drwxrwxr-x 1061 root     root         36864 Apr 14 07:12 node_modules
-rw-rw-r--    1 node     node        692936 Apr 14 06:56 package-lock.json
-rw-rw-r--    1 node     node           808 Apr 14 06:56 package.json
drwxrwxr-x    2 node     node          4096 Apr 14 06:56 public
drwxrwxr-x    2 node     node          4096 Apr 14 06:56 src

我還嘗試創建文件夾RUN mkdir -p /usr/app並使用USER node ,但最終導致 npm 無法創建node_modules文件夾的問題。

在禁用node_modulesnode用戶擁有.eslintcache的情況下是否有任何解決方法?

更新

顯然,這是因為我在 Linux 系統上使用Ubuntu和 docker 將卷作為根安裝。

在您的 Dockerfile 中RUN npm install之后添加此行將解決問題:

RUN mkdir -p node_modules/.cache && chmod -R 777 node_modules/.cache

最終 Dockerfile

FROM node:alpine

WORKDIR /usr/app

COPY package.json .
RUN npm install

RUN mkdir node_modules/.cache && chmod -R 777 node_modules/.cache

COPY . .

CMD ["npm", "run", "start"]

然后,您無需將node_modules文件夾從本地目錄復制到容器中。 您可以安全地為它添加書簽。

這是由 NPM 更改其進程的 UID 的長期問題引起的,該 UID 現在已修復 NPM 9。

具體來說,在NPM RFC 評論中對此進行了描述:

Docker 卷掛載使用主機的 UID:GID。 npm 為從 UID:GID 推斷執行用戶所做的更改有效地打破了 docker 主機用戶 UID:GID 與容器上的節點用戶不匹配的設置。 在我們的應用程序中為每個開發人員在 .env 文件中設置 UID:GID 既麻煩又荒謬。 在運行腳本時停止嘗試推斷最佳安全實踐,您的工作是成為 package 經理

此修復在v9.0.0 變更日志公告中突出顯示。

NPM追蹤器的相關變化:

我剛剛偶然發現了同樣的問題。 如果您想知道我是如何處理它的,我只是在最后一行之前添加了兩行。 它就像一個魅力。

FROM node:16.13.0-alpine

WORKDIR /app

COPY package.json ./
COPY package-lock.json ./

RUN npm config set unsafe-perm true
RUN npm install --silent

COPY . .

RUN chown -R node /app/node_modules

USER node

CMD ["npm", "start"]

如果您有本地 node_modules 文件夾,請在運行 docker 或 docker-compose 之前將其刪除

因為可能存在導致 EACCES 的另一種情況:權限被拒絕,mkdir '/usr/app/node_modules/.cache

這可能是您之前使用本地 node_modules 文件運行此 react-app 然后刪除該文件以使用容器 node_module 的情況。

因此,在刪除整個文件夾后,它仍然會重新創建該文件夾並在其中保留一個通常不可見的 .cache 文件。

因此,當您在 docker-compose.yml 或 -v "$(pwd):/usr/app" 中使用 `".:/usr/app" 為所有文件添加書簽時,它會嘗試為存儲在該 local_node 模塊存儲庫中的緩存文件添加書簽並導致所有大驚小怪。

在 DOCKER-COMPOSE 文件中,刪除您嘗試排除 node_modules 的卷。 它會起作用

我提出的解決方案是在本地安裝node_modues ,然后修改Dockerfile以將所有內容復制到容器中並將其用作卷,而不是在構建過程中安裝node_modules並為其添加書簽。 我知道這不是解決這個問題的最佳方法,但對於我幾天來一直試圖解決的問題來說,這是一個簡單的解決方案。

Dockerfile

FROM node:alpine

WORKDIR /usr/app

COPY . ./

CMD ["npm", "start"]

docker-compose

version: '3'
services: 
  test:
    stdin_open: true
    build:
      context: .
      dockerfile: Dockerfile.dev
    environment:
      - CHOKIDAR_USEPOLLING=true
    volumes:
      - .:/usr/app
    ports:
      - '3000:3000'

我遇到過同樣的問題。

問題是,我在 /tmp 中使用了vue create ,然后將創建的文件夾的內容移動到我的卷中。

顯然 npm 不太喜歡。

所以我刪除node_modules ,並使用npm install重新創建它,現在它就像一個魅力。

好吧,這清楚地表明您在節點模塊文件夾中沒有讀取、寫入和執行權限,您可能會看到節點模塊文件夾上出現一個鎖定圖標。

FOR UBUNTU 任何版本

sudo chmod a+rwx <path>/your-project-folder/node_modules

例子

sudo chmod a+rwx Desktop/react-app/node_modules

解釋

  • chmod - 更改權限
  • 一個 - 所有
  • rwx - 讀、寫和執行

要在 KUBERNETES 中解決該問題,您必須使用路徑目錄/app/.next/cache掛載一個空的 dir 卷。 檢查示例。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deploy
spec:
  template:
    metadata:
      labels:
        type: my-label
    spec:
      containers:
        image: ghcr.io/myimage
        imagePullPolicy: Always
        name: my-site
        ports:
        - containerPort: 3000
          name: http
          protocol: TCP
        volumeMounts:
        - mountPath: /app/.next/cache
          name: cache
      volumes:
      - emptyDir: {}
        name: cache

將“用戶節點”移至更高位置

我只使用 Docker(沒有 docker-compose),解決方案是將USER node移動到COPY package*...

好吧,它清楚地表明您無法訪問 docker 容器中的節點模塊。我嘗試了很多,但下面給出的表格對我有用。

運行 mkdir -p /usr/src/app

運行 chmod +rwx /usr/src/app

WORKDIR /usr/src/應用程序

首先通過上面的命令為您的工作目錄文件授予 READ WRITE EDIT 權限,然后它將正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM