Upgradeコマンドが完了しているのになぜかChaincodeがアップグレードされてない・・・
FabcarネットワークのHyperledger Fabricを使ってローカル環境で開発してたら少しハマりました。
いつもどおりpeerのupgradeコマンドでアップグレードして、完了しました。
docker exec -e "CORE_PEER_LOCALMSPID=Org1MSP" \
-e "CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp" \
cli peer chaincode upgrade -o orderer.example.com:7050 -C mychannel -n test -l "node" -v 1.1 -c '{"Args":[""]}'
Get instantiated chaincodes on channel mychannel:
Name: test, Version: 1.1, Path: /usr/local/src, Escc: escc, Vscc: vscc
でもチェーンコードを呼び出してみても、変化していない・・・
というかもっと昔のバージョンになっている気がする・・・
ネットワークを再度立ち上げてみても変わらず。
どこかでキャッシュでもされているのかと思い、探ってみると、
Dockerイメージが大量に残ってる!
今までにデプロイしたチェーンコードのDockerイメージがすべて残ってました。
なるほど、チェーンコードをデプロイすると
・Dockerイメージを作成
↓
・イメージを元にコンテナを作成
↓
・新たにできたコンテナにピアのコンテナが向いて新しいバージョンのチェーンコードが呼べるようになる
って感じなんですね。たぶん。
それぞれのDockerイメージの名前は
dev-{Peerの名前}-{チェーンコードの名前}-{バージョン番号}-{UUID}
みたいな感じになっていたのですが、
デプロイ時にPeerの名前、チェーンコード名、バージョン番号が同じイメージがあると、
新たにイメージを作るのではなく、既存のイメージを使用してコンテナを建てるという挙動なんだとおもいます。
だから昔のバージョンのチェーンコードになってたんですね。
とりあえずいらないイメージを全部削除
dev-peer0.~
という名前のイメージだったので
docker rmi $(docker images | grep dev-peer)
これでまたチェーンコードをデプロイしてみるとちゃんとアップグレードされていました!
ネットワーク自体を落としてもイメージは残るのでこんなことになっていたわけですね。
ちゃんとネットワークを落とすときに自動で消すようにします。
でもチェーンコード名とバージョン番号でコンテナのイメージを決めてるんだったら最後のUUIDいらないのでは・・・