无需sudo权限,如何删除npm run build生成的out文件夹?
解决Docker构建后无权限删除out文件夹的问题
问题背景
构建前端+Nginx的Docker镜像时,本地生成的out文件夹由当前用户创建,但其中的static目录及内部文件由root用户创建,执行rm -rf out时会报权限错误:
rm -rf out rm: cannot remove 'out/static/css/479.0d9b8ebc.chunk.css': Permission denied
不想每次用sudo删除(需要手动输入密码),需要解决权限问题让普通用户能直接删除out文件夹。
解决方案
方法1:容器内以当前本地用户身份执行构建
Docker默认以root用户运行容器,挂载本地目录后生成的文件会属于root。可以在docker run时指定当前用户的UID和GID,让容器内的构建进程用本地用户权限执行,生成的文件权限会和本地用户一致。
修改Makefile中react-build阶段的docker run命令:
react-build: build-container/Dockerfile web-application docker build -t frontend-temp -f build-container/Dockerfile . rm -rf out mkdir out docker run -it -u $(shell id -u):$(shell id -g) -v $(shell realpath out):/usr/bin/app/build frontend-temp bash -c "npm run build"
核心是添加-u $(shell id -u):$(shell id -g)参数,直接复用当前用户的身份在容器内执行构建。
方法2:构建容器内创建非root用户执行操作
遵循容器最佳实践,避免用root运行进程,在build-container的Dockerfile中创建普通用户,切换到该用户执行npm安装和构建:
修改后的build-container Dockerfile:
FROM node:16.17.0-bullseye-slim # 创建普通用户并配置目录权限 RUN useradd -m appuser RUN mkdir -p /usr/bin/app && chown -R appuser:appuser /usr/bin/app RUN npm install -g npm COPY web-application/ /usr/bin/app/ WORKDIR /usr/bin/app # 切换到普通用户执行后续操作 USER appuser RUN npm install --force # CMD ["npm", "run", "build"] EXPOSE 8080
容器内用非root用户构建后,挂载到本地的out目录文件会属于该用户(UID与本地用户一致时,本地可直接删除;不一致时也可通过普通用户权限删除,无需sudo)。
方法3:构建完成后修改挂载目录权限
在容器内完成构建后,额外执行chown命令将挂载目录的权限修改为当前本地用户:
修改Makefile中react-build的docker run命令:
docker run -it -v $(shell realpath out):/usr/bin/app/build frontend-temp bash -c "npm run build && chown -R $(shell id -u):$(shell id -g) /usr/bin/app/build"
构建完成后立即修改权限,确保本地out目录下的所有文件都属于当前用户,之后可直接删除。
内容的提问来源于stack exchange,提问作者Igor-Potapov
相关产品推荐
相关产品推荐

