宝塔Docker踩坑,挂载目录内容无法映射Could not open input file: start.php

1.添加镜像,镜像是构建容器的基础,内容就是dockerfile

安装哪些东西和对应的拓展

一、宝塔面板的 Docker 编排使用方法

  1. 进入 Docker 管理

    在宝塔面板左侧点击 Docker容器编排

  2. 添加编排

    • 点击"添加编排",填写编排名称(如 webman-app)。

    • 项目目录 :选择一个本地目录,该目录将作为 compose 项目的根目录。

    • 映射文件 :上传或粘贴 docker-compose.yaml 内容(您提供的那个)。

    • 点击确定后,宝塔会在该目录下生成 compose 文件,并自动执行 docker compose up -d 启动容器。

  3. 启动后的目录结构

    项目目录就是 compose 中所有路径(如 build: .volumes: - "./:/app")的相对路径基准


二、您的 compose 文件解析

yaml

复制代码
services:
  webman:
    build: .                     # 使用当前目录(项目目录)的 Dockerfile 构建镜像
    working_dir: /app            # 容器内工作目录
    container_name: webman
    restart: unless-stopped
    network_mode: host           # 容器使用宿主机网络
    volumes:
      - "./:/app"                # 将宿主机项目目录整个挂载到容器 /app
    command: ["php", "start.php", "start" ]  # 启动命令

关键点:

  • build: . 表示需要项目目录下有 Dockerfile

  • volumes 将宿主机项目目录(./)挂载到容器 /app,这意味着容器内 /app 的内容就是宿主机项目目录的实时映射

然后映射后 发现只有compose.yaml文件很离谱,没有挂载上

二、排查步骤(请按顺序操作)

1. 确认容器内挂载的真实宿主机源路径

执行以下命令,查看容器的挂载详情:

bash

复制代码
docker inspect <容器ID> | grep -A 5 "Mounts"

或者更简洁:

bash

复制代码
docker inspect <容器ID> --format='{{json .Mounts}}' | python -m json.tool

您会看到类似:

json

复制代码
{
  "Type": "bind",
  "Source": "/home/www/xxxx",
  "Destination": "/app",
  ...
}

记下 Source 路径,然后去宝塔文件管理里查看该路径下有哪些文件。

2. 直接进入宿主机那个 Source 路径,看是否有完整代码

如果 Source 路径下确实只有 docker-compose.yaml,那就印证了上面的推测------挂载的源目录并非您存放完整代码的那个文件夹

3. 检查宝塔的编排配置
  • 在宝塔 Docker 管理 → 容器编排,找到您的编排,点击"编辑"。

  • 查看"项目目录"的具体路径(例如 /home/www/myapp)。

  • 然后通过宝塔文件管理或 SSH 进入该目录,执行 ls -la,看是否有 start.php 等文件。

如果该目录下没有完整代码,说明您的代码可能放在了其他地方;如果有,但挂载源不是它,则说明宝塔实际执行的路径不是这个。

最终原因

宝塔并没有 在您选择的"项目目录"里直接执行 docker compose up。而是把您的 docker-compose.yaml 复制 到了它自己的内部目录(/www/server/panel/data/compose/webman),然后在这个内部目录里执行启动命令。

因为 ./(相对路径)是以执行命令的目录 为基准的,所以您的 ./ 被解析成了 /www/server/panel/data/compose/webman,而不是您放代码的那个文件夹。这个内部目录里只有宝塔生成的 docker-compose.yaml,没有您的项目代码,所以容器内的 /app 里自然也只有这一个文件。

使用绝对路径解决