[英]Docker: EACCES: permission denied, mkdir '/app/node_modules/.cache'
[英](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
運行應用程序時會導致問題。
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"]
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_modules
或node
用戶擁有.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
並為其添加書簽。 我知道這不是解決這個問題的最佳方法,但對於我幾天來一直試圖解決的問題來說,這是一個簡單的解決方案。
FROM node:alpine
WORKDIR /usr/app
COPY . ./
CMD ["npm", "start"]
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
解釋
要在 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.