Docker编译Solidity合约:文件不在允许目录的问题解决咨询
解决Docker中solc编译合约的路径权限问题
问题分析
你遇到的错误源于两个核心问题:
- Docker容器内未挂载
@openzeppelin/contracts所在的本地目录,导致solc在容器中无法定位依赖文件 --allow-paths指定的是本地主机路径,但solc运行在容器内,需要的是容器内的路径,两者不匹配导致权限校验失败
解决方案
按以下步骤调整命令和合约导入语句:
挂载OpenZeppelin依赖目录到容器
在docker run命令中新增-v参数,将本地存放OpenZeppelin的node_modules目录挂载到容器内的简洁路径(比如/openzeppelin),让容器内的solc能访问到依赖文件。修正
--allow-paths参数
将--allow-paths设置为容器内的挂载路径(/openzeppelin),同时保留原有的/sources(你的合约所在目录),多个路径用逗号分隔。修改合约导入语句
将合约中的绝对导入路径替换为容器内的挂载路径,示例:import "/openzeppelin/@openzeppelin/contracts/token/ERC20/ERC20.sol";
调整后的完整编译命令
docker run \ -v /home/user/go-ethereum-v1/contracts:/sources \ -v /home/user/.nvm/versions/node/v16.14.0/lib/node_modules:/openzeppelin \ ethereum/solc:0.8.4 \ --allow-paths=/sources,/openzeppelin \ -o /sources/abi \ --optimize \ --overwrite \ --abi --bin \ /sources/solc/Pigfox.sol
补充说明
- 如果不想修改合约导入语句,可以将本地的
/home/user/.nvm/versions/node/v16.14.0/lib目录挂载到容器内的相同路径(即-v /home/user/.nvm/versions/node/v16.14.0/lib:/home/user/.nvm/versions/node/v16.14.0/lib),同时--allow-paths设置为/sources,/home/user/.nvm/versions/node/v16.14.0/lib,这样就能保留原导入语句,但路径较长,不如挂载到短路径便捷。 - 确保本地的
@openzeppelin/contracts版本与solc 0.8.4兼容,避免出现其他编译错误。
内容的提问来源于stack exchange,提问作者pigfox
相关产品推荐
相关产品推荐

