实例化Chaincode时遇包加载失败错误:无法找到指定包
你碰到的这个问题是Hyperledger Fabric实例化链码时很常见的路径或依赖问题,结合你给出的日志信息,我整理了几个可行的排查和解决方向:
1. 核对链码的路径参数
实例化命令里的-p参数指定的路径必须和链码在GOPATH下的实际路径完全匹配。比如官方的chaincode_example02默认存放路径是$GOPATH/src/github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02,所以实例化时应该用完整路径参数:
peer chaincode instantiate -o orderer.example.com:7050 -C mychannel -n mycc -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P "OR ('Org1MSP.peer','Org2MSP.peer')" -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
别只写chaincode/chaincode_example02,因为ccenv构建容器会从/opt/gopath/src下查找对应包,短路径会导致容器找不到你的链码文件。
2. 确认GOPATH配置与代码位置
- 本地执行
echo $GOPATH,确保你的链码代码确实放在$GOPATH/src目录下的对应包路径中,比如上面提到的github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02。 - 如果你的GOPATH包含多个目录,要保证链码所在的目录在GOPATH的列表里,否则容器无法识别到代码位置。
3. 检查Peer容器的挂载配置
启动peer容器时,必须把本地的GOPATH目录挂载到容器内的/opt/gopath/src,否则ccenv构建容器访问不到你的链码代码。查看peer容器的启动命令,应该包含类似这样的挂载参数:
-v $GOPATH/src:/opt/gopath/src
如果没有这个参数,需要重新启动peer容器并添加该挂载配置。
4. 清理构建缓存
之前的失败构建可能留下了无效缓存,导致后续构建出错:
- 可以清理Docker的未使用资源:
docker system prune -f(注意:这个命令会删除未运行的容器、未使用的镜像等,操作前确认不需要这些资源)。 - 或者手动删除peer容器内的链码缓存目录,通常在
/var/hyperledger/production/chaincodes路径下,删除对应链码的文件后再重新尝试实例化。
附你提供的错误日志:
2018-03-28 12:51:27.568 UTC [util] DockerBuild -> DEBU 3b2 尝试使用镜像hyperledger/fabric-ccenv:x86_64-1.0.6进行构建
2018-03-28 12:51:28.418 UTC [chaincode-platform] func1 -> ERRO 3b3 生成特定平台的Docker构建失败:构建返回错误:1 "can't load package: package chaincode/chaincode_example02: cannot find package "chaincode/chaincode_example02" in any of: /opt/go/src/chaincode/chaincode_..."
内容的提问来源于stack exchange,提问作者Adriano V. dos Santos

