OpenShift部署Spring Boot应用报CreateContainerError mkdir非目录错误
根因定位
- 触发报错的核心原因是Dockerfile第二阶段的
COPY指令存在逻辑歧义:COPY --from=build /cgi/target/dentistapp-1.0.jar /cgi- 你使用的
openjdk:8基础镜像默认不存在/cgi目录,当COPY指令的目标路径不存在时,系统不会自动将其识别为目录,而是会将源jar包直接重命名为/cgi文件,此时镜像内的/cgi不是目录而是可执行jar包 - 后续
WORKDIR /cgi执行时,kubelet需要为容器初始化工作目录,检测到/cgi是文件不是目录,直接抛出not a directory错误
- 你使用的
- 本地Docker运行正常是因为本地有之前构建的残留镜像层,已经提前创建了
/cgi目录,COPY操作会自动将jar包放入该目录,未触发问题;而OpenShift默认采用无缓存的干净构建,所以问题直接暴露。
修复方案
调整Dockerfile第二阶段的写法,消除COPY指令的歧义,同时适配OpenShift的任意UID运行规则即可:
# Build stage FROM maven:3.6.0-jdk-8-slim AS build COPY . /cgi WORKDIR /cgi RUN mvn install # Package stage FROM openjdk:8 # 提前创建目录并设置OpenShift要求的root组权限 RUN mkdir -p /cgi && chgrp -R 0 /cgi && chmod -R g+rwX /cgi WORKDIR /cgi ENV HOME /cgi # 目标路径末尾加斜杠,明确指定是目录 COPY --from=build /cgi/target/dentistapp-1.0.jar /cgi/ EXPOSE 8080 CMD java -jar dentistapp-1.0.jar
修改后重新构建部署即可正常运行。
内容的提问来源于stack exchange,提问作者Ilja Veselov
相关产品推荐
相关产品推荐

