当 运行 mkdir 仅针对特定位置时,Dockerfile 构建失败

Dockerfile build fails when running mkdir only for particular locations

我们的应用程序是一组 docker 个容器,我的 Dockerfile 看起来像:

FROM jenkins/jenkins:lts
MAINTAINER xyz
RUN mkdir -p /opt/service
WORKDIR /opt/service
ARG NODE_ENV
ENV NODE_ENV=$NODE_ENV
COPY package.json /opt/service
COPY package-lock.json /opt/service
RUN npm install
COPY . /opt/service
CMD [ "npm", "start" ]

位置 1:myproject/jenkins/dockerfile - 执行 mkdir 失败

mkdir: cannot create directory ‘/opt/service’: Permission denied
The command '/bin/sh -c mkdir -p /opt/service' returned a non-zero code: 1

位置 2:myproject/frontend/dockerfile - docker 文件的相同副本构建良好

我的 docker-compose 文件结尾为:

app:
  build:
    context: .
    dockerfile: jenkins/Dockerfile

位置 1 给出了预期的结果,我不明白为什么位置 2 可以成功构建。

使用 jenkins/jenkins:lts 图像的默认用户是 jenkins,他没有权限在 /opt[=26= 创建文件夹].

我启动了 jenkins/jenkins:lts 容器和 运行 相同的命令:

jenkins@b4890ac012a6:/$ mkdir -p /opt/service
mkdir: cannot create directory ‘/opt/service’: Permission denied

# Equivalently
jenkins@b4890ac012a6:/opt$ mkdir service
mkdir: cannot create directory ‘service’: Permission denied

要解决这个问题,您需要先切换到 USER root 来创建目录:

....
USER root
RUN mkdir -p /opt/service
USER jenkins
....

或者你可以选择jenkins有可执行权限的路径。