1.添加镜像,镜像是构建容器的基础,内容就是dockerfile
安装哪些东西和对应的拓展
一、宝塔面板的 Docker 编排使用方法
-
进入 Docker 管理
在宝塔面板左侧点击 Docker → 容器编排。
-
添加编排
-
点击"添加编排",填写编排名称(如
webman-app)。 -
项目目录 :选择一个本地目录,该目录将作为 compose 项目的根目录。
-
映射文件 :上传或粘贴
docker-compose.yaml内容(您提供的那个)。 -
点击确定后,宝塔会在该目录下生成 compose 文件,并自动执行
docker compose up -d启动容器。
-
-
启动后的目录结构
项目目录就是 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 里自然也只有这一个文件。
使用绝对路径解决