Portainer部署Docker Compose报build path not found错误
问题根因
path not found报错和宿主机上源码文件是否存在无直接关联,核心是两个问题叠加导致:
- Compose配置语法错误:
build字段直接填写Dockerfile文件路径是无效写法,该字段默认接收构建上下文目录路径,如果要指定非默认名称的Dockerfile,需要通过子字段单独声明 - Portainer路径逻辑差异:Portainer本身以容器形式运行,Stack部署流程的compose解析动作是在Portainer容器内部执行,你填写的
/opt/fritzbox-metrics是宿主机路径,默认没有被挂载进Portainer容器内部,容器内自然找不到对应路径。之前尝试添加-f参数无法解决问题,因为该参数作用是指定compose文件位置,和构建上下文路径无关。
补充:项目提供的原始Compose确实存在语法错误,错将服务配置写在了
networks层级下,属于无效配置,你修正services层级的操作没有问题。
解决方案
二选一即可,优先推荐方案1,配置更简单不会出现权限类衍生问题。
方案1:宿主机提前构建镜像(推荐)
不需要修改Portainer原有配置,直接避开构建路径问题:
- 进入宿主机源码目录,手动构建本地镜像:
cd /opt/fritzbox-metrics sudo docker build -t fritzbox-metrics:local .
- 回到Portainer Stack编辑页面,将原配置中的
build字段替换为image字段调用本地构建好的镜像,最终可用配置如下:
version: "3.3" services: fritzbox-metrics: image: fritzbox-metrics:local container_name: fritzbox-metrics environment: - FRITZ_ADDRESS=192.168.99.1 - FRITZ_USERNAME=user - FRITZ_PASSWORD=topsecret - FRITZ_USE_TLS=True - TELEGRAF_HOSTNAME=192.168.99.4 - TELEGRAF_PORT=8094 - SAMPLE_PERIOD=10 restart: unless-stopped
- 直接点击部署即可正常启动容器。
方案2:挂载目录保留Stack内构建流程
如果需要保留Stack部署时自动构建镜像的能力,按以下步骤调整:
- 停止现有Portainer容器,重新启动时添加宿主机源码目录的挂载,将
/opt/fritzbox-metrics映射到Portainer容器内部同路径,参考启动命令:
sudo docker run -d -p 9000:9000 -p 9443:9443 \ --name portainer \ --restart=always \ -v /var/run/docker.sock:/var/run/docker.sock \ -v portainer_data:/data \ -v /opt/fritzbox-metrics:/opt/fritzbox-metrics \ portainer/portainer-ce:latest
- 修正Compose文件中
build字段的语法,正确写法如下:
version: "3.3" services: fritzbox-metrics: build: context: /opt/fritzbox-metrics dockerfile: Dockerfile container_name: fritzbox-metrics environment: - FRITZ_ADDRESS=192.168.99.1 - FRITZ_USERNAME=user - FRITZ_PASSWORD=topsecret - FRITZ_USE_TLS=True - TELEGRAF_HOSTNAME=192.168.99.4 - TELEGRAF_PORT=8094 - SAMPLE_PERIOD=10 restart: unless-stopped
- 重新部署Stack即可正常完成构建和启动。
内容的提问来源于stack exchange,提问作者Michael Mueller
相关产品推荐
相关产品推荐

