场景
我在节点的compose文件中进行了数据挂载:
- ../../data/bank1/peer1:/tmp/hyperledger/bank1/peer1
但是运行是依然报错为var/hyperledger/production的权限问题,并且我也已经对../../data/bank1/peer1目录设置了操作权限
services:peer1-bank1:container_name: peer1-bank1image: hyperledger/fabric-peeruser: "${LOCAL_UID:-1000}:${LOCAL_GID:-1000}"environment:- CORE_PEER_ID=peer1-bank1- CORE_PEER_ADDRESS=peer1-bank1:7051- CORE_PEER_LOCALMSPID=Bank1MSP- CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/msp- CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock- CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=fabric-bank1- FABRIC_LOGGING_SPEC=debug- CORE_PEER_TLS_ENABLED=true- CORE_PEER_TLS_CERT_FILE=/etc/hyperledger/tls/signcerts/cert.pem- CORE_PEER_TLS_KEY_FILE=/etc/hyperledger/tls/keystore/key.pem- CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/tlsca/tls-ca-cert.pem- CORE_PEER_GOSSIP_USELEADERELECTION=true- CORE_PEER_GOSSIP_ORGLEADER=false- CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1-bank1:7051- CORE_PEER_GOSSIP_SKIPHANDSHAKE=false- CORE_LEDGER_STATE_STATEDATABASE=CouchDB- CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couchdb.peer1-bank1:5984- CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME=admin- CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD=adminpwworking_dir: /opt/gopath/src/github.com/hyperledger/fabric/bank1/peer1volumes:- ../chaincodeRun:/host/var/run- ../../data/bank1/peer1:/tmp/hyperledger/bank1/peer1 - ../../organizations/peerOrganizations/bank1.example.com/peers/peer1-bank1.bank1.example.com/msp:/etc/hyperledger/msp- ../../organizations/peerOrganizations/bank1.example.com/peers/peer1-bank1.bank1.example.com/tls:/etc/hyperledger/tls- ../../organizations/fabric-ca/tls-ca/crypto:/etc/hyperledger/tlscanetworks:- fabric-bank1
报错日志:
panic: Could not create _lifecycle chaincodes install path: mkdir /var/hyperledger/production: permission denied。
根本原因:
首先,Fabric Peer 默认将 fileSystemPath为 /var/hyperledger/production。这表示即使我进行了挂载,但是启动时节点依然会在producction目录下操作,所以并没有挂载正确。
然后,docker compose文件通常以root身份启动运行。但是如果像我一样在YAML文件里设置了user的字段,类似“user: "${LOCAL_UID:-1000}:${LOCAL_GID:-1000}"”,就会以其他身份进行操作。同时,由于var/hyperledger/production目录只能由root用户操作,再加上前面说的挂载不正确,所以会报错没有权限。
解决方案:
最简单的,可通过环境变量 CORE_PEER_FILESYSTEMPATH 覆盖系统默认的/var/hyperledger/productionl路径。可以换为我们自定义的。
其次,就是将挂载目录修改为系统默认的路径。
但是这两者都需要注意给宿主主机的挂载路径配置操作权限