當我嘗試透過 docker-compose 啟動我的服務時,收到以下錯誤訊息:
service_frontend | npm 錯誤!代碼128
service_frontend | npm 錯誤!發生未知的 git 錯誤
service_frontend | npm 錯誤!指令 git --no-replace-objects clone -b feature/WHITELABEL-212-sculpts-während-der-lad https://bjoernme:***@bitbucket.org/faaren/faaren-ui.git /root/。 npm/_cacache/tmp/git-cloneBmjHnf --recurse-submodules --深度=1
service_frontend | npm 錯誤!致命:無法建立「/root/.npm/_cacache/tmp/git-cloneBmjHnf」的前導目錄:權限被拒絕
服務前端|
service_frontend | npm 錯誤!可以在以下位置找到此運行的完整日誌:
service_frontend | npm 錯誤! /root/.npm/_logs/2022-06-24T13_42_41_376Z-debug.log
service_frontend 退出,代碼為 128
我在docker-compose.yml 中嘗試了多個星座作為使用者屬性,從root、root:root、node:node、1000:1000、UID:GID 開始(變數設定為注入我的本機使用者ID和組ID。
我的 docker-compose.yml 中的相關部分:
service_frontend: build: context: /workspace/faaren-services/frontend dockerfile: Dockerfile args: dev: "true" command: bash -c "npm install --save-dev chokidar@3.5.2 && composer install && php artisan octane:start --server=swoole --host=0.0.0.0 --port=8080 --watch" user: root volumes: - /workspace/faaren-services/frontend:/var/www/html - ./docker-conf/supervisor/supervisord.conf:/etc/supervisor/conf.d/supervisord.conf - ./docker-conf/php/debugger.ini:/usr/local/etc/php/conf.d/debugger.ini
這是我本地的 docker 映像:
FROM eu.gcr.io/faaren-prod/frontend-base-image:latest COPY . /var/www/html ARG dev=false RUN if [ ${dev} = "true" ] ; then set -ex && apk add --no-cache npm && mkdir -p /.npm && mkdir -p /root/.npm/_cacache/tmp/ && chmod 777 -R "/root/.npm/_cacache/tmp/" && chmod 777 -R "/.npm" fi ;
這是我們的內部基礎鏡像(基於 php:8.1.1-fpm-alpine3.15 鏡像:
FROM php:8.1.1-fpm-alpine3.15 WORKDIR /var/www/html/ RUN apk add --no-cache --update git npm RUN mkdir /.npm RUN mkdir /.cache RUN chown -R 1000:1001 "/.npm" RUN chown -R 1000:1001 "/.cache"
深入研究這個問題後,我發現,在 Node 16.15.1 中,npm 任務中的所有命令都以擁有當前工作目錄的使用者身分執行。因此,即使在以 root 子命令執行
npm i
時,git clone
也會以目前工作目錄所屬的使用者身分執行。就我而言,
/var/www/html/
屬於 user:group 33333:33333。npm i
以 root 身分運行。對於一些 git clone 指令,這些指令是以使用者 33333 的身分執行的。因此,不允許使用者 33333 存取 /root/.npm 下的預設快取 npm 資料夾,因為該資料夾屬於使用者 root。我透過以下方式解決了問題:
mkdir /var/www/.npm/cache
chown -R 33333:33333 /var/www/.npm/cache
npm config set cache /var/www/.npm/cache --global