You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

问题根源分析

  1. 缺失postgres运行环境:最终构建阶段基于eclipse-temurin:8-alpine镜像,该镜像未安装postgres,缺少entrypoint脚本依赖的系统工具、默认环境变量(如PGDATA)及目录结构。
  2. PGDATA变量未正确设置:最终阶段未显式设置PGDATA环境变量,导致entrypoint脚本执行时尝试创建空路径的目录,触发报错。
  3. 无用的脚本执行:最终阶段目标是运行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 10:55:53