Dockerfile构建报错:mkdir无法创建空目录,求排查方案
问题:Docker构建中执行postgres entrypoint脚本报错
mkdir: cannot create directory ‘’: No such file or directory 因托管环境限制,需在单个Dockerfile中完成数据库与应用的一体化构建。编写了对应Dockerfile及source.sh脚本,但执行RUN ["/usr/local/bin/docker-entrypoint.sh", "postgres"]时触发错误:mkdir: cannot create directory ‘’: No such file or directory,无法定位问题根源。
完整Dockerfile
ARG DATA_DIR_GLOB=/tmp/dumper ARG PGDATA_GLOB=/var/lib/postgresql/data ARG DOC_ENT_PNT_GLOB=/usr/local/bin FROM postgres:9 AS dumper ARG DOC_ENT_PNT_GLOB ENV DOC_ENT_PNT=${DOC_ENT_PNT_GLOB} COPY scripts/schema.sh $DOC_ENT_PNT/schema.sh RUN chmod +x $DOC_ENT_PNT/schema.sh COPY .env $DOC_ENT_PNT ENV USR_DATA=/usr/data COPY scripts/source.sh $USR_DATA/source.sh RUN chmod +x $USR_DATA/source.sh RUN $USR_DATA/source.sh ARG DATA_DIR_GLOB ENV PGDATA=${DATA_DIR_GLOB} # idle call to populate PGDATA RUN ["/usr/local/bin/docker-entrypoint.sh", "postgres"] FROM postgres:9 AS databuilder ARG PGDATA_GLOB ENV PGDATA=${PGDATA_GLOB} # DATA_DIR_GLOB is temporary dir in previous dumper ARG DATA_DIR_GLOB COPY --from=dumper ${DATA_DIR_GLOB} $PGDATA FROM eclipse-temurin:8-alpine AS buildapp ARG DATA_DIR_GLOB ENV DATA_DIR=${DATA_DIR_GLOB} RUN mkdir -p $DATA_DIR COPY --from=databuilder / $DATA_DIR ARG PGDATA_GLOB ENV PGDATA=${PGDATA_GLOB} ENV HOME=/usr/app RUN mkdir -p $HOME WORKDIR $HOME COPY . $HOME RUN --mount=type=cache,target=/root/.m2 ./mvnw -f $HOME/pom.xml clean install FROM eclipse-temurin:8-alpine ARG DATA_DIR_GLOB ENV DATA_DIR=${DATA_DIR_GLOB} COPY --from=buildapp $DATA_DIR / ARG DOC_ENT_PNT_GLOB ENV DOC_ENT_PNT=${DOC_ENT_PNT_GLOB} RUN ls -la $DOC_ENT_PNT ARG JAR_FILE=/usr/app/target/*.jar COPY --from=buildapp $JAR_FILE /app/runner.jar # failed: 1.105 mkdir: cannot create directory ‘’: No such file or directory RUN ["/usr/local/bin/docker-entrypoint.sh", "postgres"] EXPOSE 4000 ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=prod", "/app/runner.jar"]
source.sh内容
#!/bin/bash -x TEXT_INN="set -a && . .env && set +a" sed -i "2 a $TEXT_INN " /usr/local/bin/docker-entrypoint.sh TEXT_TO_REPLACE='exec "$@"' REPLACEMENT='echo "skipping..."' sed -i -e "s/$TEXT_TO_REPLACE/$REPLACEMENT/g" /usr/local/bin/docker-entrypoint.sh
构建日志
Building 155.9s (25/25) FINISHED docker:default => [internal] load build definition from Dockerfile_new 0.5s => => transferring dockerfile: 1.70kB 0.0s => [internal] load metadata for docker.io/library/postgres:9 0.0s => [internal] load metadata for docker.io/library/eclipse-temurin:8-alpine 2.6s => [internal] load .dockerignore 0.4s => => transferring context: 110B 0.0s => [buildapp 1/7] FROM docker.io/library/eclipse-temurin:8-alpine@sha256:f68b4c60e503c2f023911ed41b40d2fe44b40ffa1a7aa7967cf724adc4a9d3d2 18.8s => => resolve docker.io/library/eclipse-temurin:8-alpine@sha256:f68b4c60e503c2f023911ed41b40d2fe44b40ffa1a7aa7967cf724adc4a9d3d2 0.6s => => sha256:f68b4c60e503c2f023911ed41b40d2fe44b40ffa1a7aa7967cf724adc4a9d3d2 1.38kB / 1.38kB 0.0s => => sha256:ff5812ab99164c2d32dde7f2085ea134bf8684166a3c849fa813801560998a2d 1.94kB / 1.94kB 0.0s => => sha256:117d830501d88ed1b23d7f9676d6663eb38470c409ffed8125206dd4ed790694 3.77kB / 3.77kB 0.0s => => sha256:f18232174bc91741fdf3da96d85011092101a032a93a388b79e99e69c2d5c870 3.64MB / 3.64MB 0.9s => => sha256:f0e051779621babce45fd71367a0c87a5078c4a8c05300e0aaa03c5ed16394f8 16.18MB / 16.18MB 4.8s => => sha256:7c4119d6c392dd343a89edc4139e141ba64150668fc685c394fecd95daacc9de 52.63MB / 52.63MB 7.3s => => extracting sha256:f18232174bc91741fdf3da96d85011092101a032a93a388b79e99e69c2d5c870 0.4s => => sha256:bb653b79f50152b98bc9181e457100d854227740b5903015ff279145de70b2b6 128B / 128B 2.1s => => sha256:497368c2ceb6756665d99b9bad58be8b90f42929da7d304904908dae2fee40a4 2.30kB / 2.30kB 3.9s => => extracting sha256:f0e051779621babce45fd71367a0c87a5078c4a8c05300e0aaa03c5ed16394f8 1.1s => => extracting sha256:7c4119d6c392dd343a89edc4139e141ba64150668fc685c394fecd95daacc9de 1.7s => => extracting sha256:bb653b79f50152b98bc9181e457100d854227740b5903015ff279145de70b2b6 0.0s => => extracting sha256:497368c2ceb6756665d99b9bad58be8b90f42929da7d304904908dae2fee40a4 0.0s => [internal] load build context 1.1s => => transferring context: 36.46MB 0.5s => CACHED [dumper 1/8] FROM docker.io/library/postgres:9 0.0s => [dumper 2/8] COPY scripts/schema.sh /usr/local/bin/schema.sh 3.1s => [dumper 3/8] RUN chmod +x /usr/local/bin/schema.sh 4.1s => [dumper 4/8] COPY .env /usr/local/bin 4.3s => [dumper 5/8] COPY scripts/source.sh /usr/data/source.sh 1.8s => [dumper 6/8] RUN chmod +x /usr/data/source.sh 3.9s => [dumper 7/8] RUN /usr/data/source.sh 3.7s => [buildapp 2/7] RUN mkdir -p /tmp/dumper 3.5s => [dumper 8/8] RUN ["/usr/local/bin/docker-entrypoint.sh", "postgres"] 44.5s => [databuilder 2/2] COPY --from=dumper /tmp/dumper /var/lib/postgresql/data 2.1s => [buildapp 3/7] COPY --from=databuilder / /tmp/dumper 9.0s => [buildapp 4/7] RUN mkdir -p /usr/app 2.3s => [buildapp 5/7] WORKDIR /usr/app 1.5s => [buildapp 6/7] COPY . /usr/app 1.9s => [buildapp 7/7] RUN --mount=type=cache,target=/root/.m2 ./mvnw -f /usr/app/pom.xml clean install 46.0s => [stage-3 2/5] COPY --from=buildapp /tmp/dumper / 7.7s => [stage-3 3/5] RUN ls -la /usr/local/bin 2.0s => [stage-3 4/5] COPY --from=buildapp /usr/app/target/*.jar /app/runner.jar 2.3s => ERROR [stage-3 5/5] RUN ["/usr/local/bin/docker-entrypoint.sh", "postgres"] 2.5s ------ > [stage-3 5/5] RUN ["/usr/local/bin/docker-entrypoint.sh", "postgres"]: 1.293 mkdir: cannot create directory ‘’: No such file or directory ------ Dockerfile_new:70 -------------------- 68 | 69 | # blocker: 1.105 mkdir: cannot create directory ‘’: No such file or directory 70 | >>> RUN ["/usr/local/bin/docker-entrypoint.sh", "postgres"] 71 | EXPOSE 4000 72 | ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=prod", "/app/runner.jar"] -------------------- ERROR: failed to solve: process "/usr/local/bin/docker-entrypoint.sh postgres" did not complete successfully: exit code: 1 Failed to deploy '<unknown> Dockerfile: Dockerfile_new': Image build failed with exit code 1.
问题根源分析
- 缺失postgres运行环境:最终构建阶段基于
eclipse-temurin:8-alpine镜像,该镜像未安装postgres,缺少entrypoint脚本依赖的系统工具、默认环境变量(如PGDATA)及目录结构。 - PGDATA变量未正确设置:最终阶段未显式设置
PGDATA环境变量,导致entrypoint脚本执行时尝试创建空路径的目录,触发报错。 - 无用的脚本执行:最终阶段目标是运行Java应用,完全不需要执行postgres的entrypoint脚本,这一步属于冗余操作。
解决步骤
核心修复:移除冗余的RUN命令
直接删除最终阶段中执行postgres entrypoint的命令,因为该操作对Java应用运行毫无意义:
# 删除这一行无用命令 # RUN ["/usr/local/bin/docker-entrypoint.sh", "postgres"]
补充优化建议
- 数据库初始化逻辑完全放在
dumper和databuilder阶段,生成预初始化的数据库数据目录即可,无需在Java镜像中执行postgres相关操作。 - 如果应用需要内嵌数据库,建议使用H2等轻量内嵌数据库,避免在Java镜像中打包postgres,减少镜像体积并简化运维。
内容的提问来源于stack exchange,提问作者Ainz Sama
相关产品推荐
相关产品推荐

