Dockerfile中USER node未优先执行,RUN mkdir时报找不到node用户是什么原因?
问题原因说明
你遇到的报错和Docker缓存无关,也不存在指令执行顺序颠倒的情况,核心问题如下:
alpine:3.10基础镜像默认不存在node用户,你写的RUN apk add --update仅更新了apk软件源,没有实际安装nodejs包,也没有手动创建node用户,所以切换到不存在的用户后,后续所有指令都会报错- Docker的
USER指令作用是指定后续所有RUN、CMD、ENTRYPOINT指令的执行用户,你在USER node执行时就已经命中了用户不存在的问题,执行后续RUN mkdir时就会抛出找不到用户的错误,并不是RUN mkdir先于USER执行
修复方案
你可以选择以下任意一种方案修改Dockerfile:
方案1:直接安装nodejs(推荐)
安装nodejs包后会自动生成对应的node用户和用户组,修改后Dockerfile如下:
FROM alpine:3.10 # 同时安装nodejs和npm,安装完成自动生成node用户 RUN apk add --update nodejs npm USER node RUN mkdir /home/node/code WORKDIR /home/node/code COPY --chown=node:node package-lock.json package.json ./ RUN npm ci COPY --chown=node:node . . EXPOSE 3000 CMD ["node", "index.js"]
方案2:手动创建node用户
如果你不需要通过apk安装nodejs,可以手动创建用户:
FROM alpine:3.10 RUN apk add --update \ # 手动创建node用户组和用户 && addgroup -S node \ && adduser -S node -G node USER node RUN mkdir /home/node/code WORKDIR /home/node/code COPY --chown=node:node package-lock.json package.json ./ RUN npm ci COPY --chown=node:node . . EXPOSE 3000 CMD ["node", "index.js"]
修改完成后,执行构建命令时可以添加--no-cache参数规避旧缓存影响:docker build --no-cache -t node-app-apline .
构建完成后再执行原有run命令即可正常启动。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

