場景
我在節點的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路徑。可以換為我們自定義的。
其次,就是將掛載目錄修改為系統默認的路徑。
但是這兩者都需要注意給宿主主機的掛載路徑配置操作權限