Docker Node镜像生成文件权限异常问题及解决诉求
解决Docker执行npm命令的权限问题
问题核心
- 指定
node用户执行时:挂载的/local/mobile目录本地权限与容器内node用户的UID/GID不匹配,导致无法创建node_modules目录 - 指定本地
$(id -u):$(id -g)执行时:容器内该UID/GID对应的用户不存在且无家目录,npm尝试在根目录创建.npm缓存目录时触发权限错误
方案1:指定npm缓存目录到挂载路径
直接让npm将缓存写入挂载的本地项目目录,避免访问根目录:
docker run -u "$(id -u):$(id -g)" --rm -v $PWD:/local node:19.3.0 bash -c "cd local/mobile && npm install --legacy-peer-deps --cache ./npm-cache && npx ionic build && npx ionic cap copy"
生成的node_modules权限会与本地用户一致,同时缓存文件会存在项目目录下的npm-cache文件夹中。
方案2:在容器内临时创建匹配本地权限的用户
临时创建与本地用户UID/GID一致的用户并指定家目录,解决无家目录导致的缓存问题:
docker run --rm -v $PWD:/local node:19.3.0 bash -c " addgroup -g $(id -g) localgroup && \ adduser -u $(id -u) -G localgroup -D localuser && \ su localuser -c 'cd /local/mobile && npm install --legacy-peer-deps && npx ionic build && npx ionic cap copy' "
方案3:统一容器node用户与本地用户的UID/GID(固定环境适用)
修改容器内node用户的UID/GID匹配本地用户,适合长期固定的开发环境:
docker run --rm -v $PWD:/local node:19.3.0 bash -c " usermod -u $(id -u) node && \ groupmod -g $(id -g) node && \ su node -c 'cd /local/mobile && npm install --legacy-peer-deps && npx ionic build && npx ionic cap copy' "
若需长期使用,建议基于官方Node镜像构建自定义镜像,提前修改node用户的UID/GID。
方案4:临时调整本地目录权限
给项目目录添加其他用户的写入权限,再用node用户执行命令:
# 本地调整权限 chmod o+w $PWD/mobile # 执行Docker命令 docker run -u "node" --rm -v $PWD:/local node:19.3.0 bash -c "cd local/mobile && npm install --legacy-peer-deps && npx ionic build && npx ionic cap copy"
内容的提问来源于stack exchange,提问作者Brandon Kauffman
相关产品推荐
相关产品推荐

