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

Ubuntu虚拟机运行Sawtooth项目Docker Compose报startup权限被拒错误

问题根因

这个报错是绑定挂载到容器内的启动脚本缺失可执行权限导致的,属于跨系统文件权限机制差异问题:

  • Windows的NTFS文件系统没有Linux/Unix系统的可执行权限位设计,在Windows宿主机运行Docker时,Docker Desktop会自动兼容处理挂载文件的执行权限,因此可以正常启动
  • Ubuntu虚拟机使用ext4等原生Linux文件系统,你在compose配置中通过bind mount把本地项目目录挂载到容器的/taskledger路径,宿主机上的startup脚本没有可执行权限时,容器内进程无权直接运行该脚本,就会触发permission denied错误
解决方案

方案1:给宿主机上的启动脚本添加可执行权限(开发调试场景首选)

进入Ubuntu虚拟机中存放sawtooth-default.yaml的项目根目录,执行命令给脚本加执行权限:

chmod +x ./startup

执行完成后重新构建启动服务即可:

sudo docker-compose -f sawtooth-default.yaml up --build

注意:如果项目目录存放在VirtualBox/VMware和Windows的共享文件夹中,这类共享文件系统不支持Linux权限位设置,chmod命令不会生效,直接使用方案2或方案3即可。也可以执行mount | grep 你的项目目录路径查看分区挂载参数,确认没有配置noexec(禁止分区内文件执行)参数,该参数也会触发同类报错。

方案2:调整compose启动命令,绕过可执行权限检查

不需要修改文件权限,直接调整sawtooth-default.yaml中processor服务的entrypoint配置,显式用bash解释器调用启动脚本,此时只需要bash本身有执行权限即可,不需要脚本文件带可执行位:
找到processor服务的entrypoint配置段,修改为:

entrypoint: |
     bash /taskledger/startup -vv tcp://validator:4004

修改完成后重新执行启动命令即可生效。

方案3:构建镜像时内置项目代码(生产环境推荐)

当前运行时挂载本地目录的配置仅适合开发调试,生产环境建议直接在构建镜像阶段把代码复制进镜像,提前配置好权限,避免挂载带来的各类权限问题:
在原有Dockerfile末尾添加两行配置:

COPY . /taskledger
RUN chmod +x /taskledger/startup

同时删除sawtooth-default.yaml中processor服务下的volumes挂载配置,重新构建启动服务即可。

内容的提问来源于stack exchange,提问作者Muhammad Hafizuddin Mohd Padzl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 10:36:22