如何为Dockerfile中创建的tmp文件夹设置正确权限?
解决NestJS Docker容器中tmp文件夹权限拒绝问题
问题原因
你的Dockerfile中,tmp文件夹是通过root用户执行RUN mkdir -p /usr/src/app/tmp创建的,因此该文件夹的属主和属组均为root。后续切换到nestjs用户后,这个用户仅拥有该文件夹的读、执行权限,没有写入权限,导致应用在tmp目录创建文件时触发"Permission denied"错误。
当前RUN与WORKDIR的顺序本身没有问题——你先创建tmp目录再设置工作目录,只是因为创建目录用的是绝对路径,所以顺序不影响最终目录的位置,但权限配置缺失才是核心问题。
修复方案
你可以通过修改tmp目录的权限,让nestjs用户拥有写入权限,具体调整Dockerfile如下:
FROM node:20.0.0-alpine3.17 RUN apk add dumb-init RUN mkdir -p /usr/src/app/tmp WORKDIR /usr/src/app RUN addgroup -g 1001 -S nodejs RUN adduser -S nestjs -u 1001 COPY --from=deps /usr/src/app/node_modules ./node_modules COPY ./ ./ # 新增:将tmp目录的属主和属组改为nestjs用户及nodejs组 RUN chown -R nestjs:nodejs /usr/src/app/tmp USER nestjs ENTRYPOINT ["/usr/bin/dumb-init", "--"] CMD ["node", "main.js"]
另一种优化方案(提前切换用户创建目录)
如果你不想修改权限,也可以调整步骤,先创建用户再切换到nestjs用户创建tmp目录,这样目录默认属主就是该用户:
FROM node:20.0.0-alpine3.17 RUN apk add dumb-init WORKDIR /usr/src/app # 先创建用户组和用户 RUN addgroup -g 1001 -S nodejs RUN adduser -S nestjs -u 1001 # 切换到nestjs用户创建tmp目录 USER nestjs RUN mkdir -p ./tmp # 切回root用户执行COPY(避免文件权限问题) USER root COPY --from=deps /usr/src/app/node_modules ./node_modules COPY ./ ./ # 最后再切换回nestjs用户启动应用 USER nestjs ENTRYPOINT ["/usr/bin/dumb-init", "--"] CMD ["node", "main.js"]
两种方案都能解决权限问题,第一种更简洁,第二种则从根源上保证目录属于运行应用的用户。
内容的提问来源于stack exchange,提问作者user3142695
相关产品推荐
相关产品推荐

