wefantasy / FabricLearn

本项目虚拟了一个工作室联盟链需求并将逐步实现,致力于提供一个易理解、可复现的Fabric学习项目,其中项目部署步骤的各个环节都拆解至清晰可见,并且将所有实验打包为脚本使之能够被快速复现在任何一台具备基础环境的主机上。
https://ifantasy.net/tags/fabriclearn/
53 stars 17 forks source link

无法安装 chaincode: hyperledger/fabric-ccenv:2.1: no matching manifest for linux/arm64/v8 in the manifest list entries #5

Closed ZoomQuiet closed 1 year ago

ZoomQuiet commented 2 years ago

background

2_FabricNetworkUpdate 案例中 fabric-contract-api-go v1.1.1 加载失败

goal

先在 arm64 环境中, 可以完整跑完一个基本的 HLF 案例,

error

因为不知道哪一步可能出错, 所以, 手工逐一执行 4_TestChaincode.sh 中的指令

第一步就出错: $ peer lifecycle chaincode install basic.tar.gz

Error: chaincode install failed with status: 500 - failed to invoke backing implementation of 'InstallChaincode': could not build chaincode: docker build failed: docker image build failed: docker build failed: Failed to pull hyperledger/fabric-ccenv:2.1: no matching manifest for linux/arm64/v8 in the manifest list entries

guess

对应 core.yaml 中有关版本的配置使用的是: $(TWO_DIGIT_VERSION) 但是, 其它 .yam 中使用的是 ${DOCKER_CA_PATH}

前者 在 bash 中无法用 echo 指令打印出内容, 后者可以...

也许是这个问题?

ZoomQuiet commented 2 years ago

SEE:no matching manifest for linux/arm64/v8 in the manifest list entries · Issue #1 · busan15/fabric-binaries-pi

尝试对已经下载的 镜像 进行别名: $ docker images | grep ccenv

busan15/fabric-ccenv                2.1                              bb0ff0bcb00f   2 years ago    542MB
hyperledger/fabric-ccenv            2.1                              bb0ff0bcb00f   2 years ago    542MB
hyperledger/fabric-ccenv            arm64-2.1                        bb0ff0bcb00f   2 years ago    542MB

依然是相同问题:

$ peer lifecycle chaincode install basic.tar.gz Error: chaincode install failed with status: 500 - failed to invoke backing implementation of 'InstallChaincode': could not build chaincode: docker build failed: docker image build failed: docker build failed: Failed to pull hyperledger/fabric-ccenv:2.1: no matching manifest for linux/arm64/v8 in the manifest list entries

这种加载编译容器的行为是在哪儿可以配置的?

ZoomQuiet commented 2 years ago

SEE:

才反应过来: 是得在 docker-compose.yaml 中对应 peer 容器定义的 environment: 中追加

  • CORE_CHAINCODE_BUILDER=busan15/fabric-ccenv:arm64-2.1

现在就可以进入指定容器展开编译了:

$ peer lifecycle chaincode install basic.tar.gz

Error: chaincode install failed with status: 500 - failed to invoke backing implementation of 'InstallChaincode': could not build chaincode: docker build failed: docker image build failed: docker build failed: Error returned from build: 2 "google.golang.org/protobuf/internal/flags
google.golang.org/protobuf/internal/set
golang.org/x/sys/internal/unsafeheader
google.golang.org/grpc/attributes
google.golang.org/protobuf/internal/detrand
google.golang.org/protobuf/internal/pragma
google.golang.org/protobuf/internal/version
golang.org/x/net/internal/timeseries
google.golang.org/protobuf/internal/errors
google.golang.org/grpc/backoff
google.golang.org/protobuf/encoding/protowire
golang.org/x/sys/unix
google.golang.org/grpc/internal/grpclog
golang.org/x/net/trace
google.golang.org/grpc/grpclog
google.golang.org/protobuf/reflect/protoreflect
google.golang.org/grpc/connectivity
google.golang.org/grpc/internal/credentials
google.golang.org/grpc/serviceconfig
google.golang.org/grpc/metadata
google.golang.org/protobuf/internal/encoding/messageset
google.golang.org/protobuf/internal/strs
google.golang.org/protobuf/internal/genid
google.golang.org/protobuf/internal/order
google.golang.org/protobuf/reflect/protoregistry
google.golang.org/protobuf/internal/encoding/text
google.golang.org/protobuf/runtime/protoiface
google.golang.org/protobuf/internal/descfmt
google.golang.org/protobuf/proto
google.golang.org/protobuf/internal/encoding/defval
google.golang.org/protobuf/internal/descopts
google.golang.org/protobuf/internal/encoding/json
google.golang.org/grpc/internal/grpcrand
google.golang.org/grpc/codes
google.golang.org/grpc/encoding
google.golang.org/grpc/internal/backoff
google.golang.org/grpc/internal/balancerload
google.golang.org/grpc/internal/grpcutil
google.golang.org/grpc/internal/buffer
google.golang.org/grpc/internal/grpcsync
google.golang.org/grpc/internal/envconfig
google.golang.org/protobuf/encoding/prototext
google.golang.org/protobuf/internal/filedesc
golang.org/x/text/transform
golang.org/x/text/unicode/bidi
golang.org/x/text/unicode/norm
golang.org/x/net/http2/hpack
google.golang.org/grpc/internal/syscall
golang.org/x/text/secure/bidirule
google.golang.org/grpc/keepalive
google.golang.org/grpc/stats
google.golang.org/grpc/tap
github.com/hyperledger/fabric-contract-api-go/contractapi/utils
google.golang.org/protobuf/internal/encoding/tag
google.golang.org/protobuf/encoding/protojson
github.com/mailru/easyjson/jlexer
golang.org/x/net/idna
google.golang.org/protobuf/internal/impl
github.com/mailru/easyjson/buffer
github.com/mailru/easyjson/jwriter
gopkg.in/yaml.v2
golang.org/x/net/http/httpguts
github.com/PuerkitoBio/urlesc
golang.org/x/net/http2
golang.org/x/text/width
github.com/PuerkitoBio/purell
# golang.org/x/net/http2
vendor/golang.org/x/net/http2/transport.go:416:45: undefined: os.ErrDeadlineExceeded
github.com/xeipuuv/gojsonpointer
github.com/xeipuuv/gojsonreference
github.com/joho/godotenv
github.com/xeipuuv/gojsonschema
github.com/rogpeppe/go-internal/semver
github.com/rogpeppe/go-internal/module
github.com/rogpeppe/go-internal/modfile
github.com/gobuffalo/envy
github.com/go-openapi/swag
github.com/gobuffalo/packd/internal/takeon/github.com/markbates/errx
github.com/gobuffalo/packd
github.com/gobuffalo/packr
github.com/go-openapi/jsonpointer
github.com/go-openapi/jsonreference
github.com/go-openapi/spec
github.com/hyperledger/fabric-contract-api-go/internal/utils
google.golang.org/protobuf/internal/filetype
google.golang.org/protobuf/runtime/protoimpl
google.golang.org/protobuf/types/descriptorpb
google.golang.org/protobuf/types/known/timestamppb
google.golang.org/protobuf/types/known/emptypb
google.golang.org/protobuf/types/known/anypb
github.com/golang/protobuf/ptypes/timestamp
github.com/golang/protobuf/ptypes/empty
github.com/golang/protobuf/ptypes/any
google.golang.org/protobuf/types/known/durationpb
google.golang.org/genproto/googleapis/rpc/status
github.com/hyperledger/fabric-contract-api-go/internal/types
github.com/golang/protobuf/ptypes/duration
github.com/hyperledger/fabric-contract-api-go/metadata
google.golang.org/protobuf/reflect/protodesc
github.com/hyperledger/fabric-contract-api-go/serializer
github.com/hyperledger/fabric-contract-api-go/internal
github.com/golang/protobuf/proto
github.com/hyperledger/fabric-protos-go/ledger/rwset
github.com/golang/protobuf/jsonpb
google.golang.org/grpc/credentials
github.com/hyperledger/fabric-protos-go/msp
google.golang.org/grpc/encoding/proto
github.com/golang/protobuf/ptypes
google.golang.org/grpc/internal/channelz
github.com/hyperledger/fabric-chaincode-go/pkg/attrmgr
github.com/hyperledger/fabric-protos-go/common
github.com/hyperledger/fabric-chaincode-go/pkg/cid
google.golang.org/grpc/channelz
google.golang.org/grpc/internal/pretty
google.golang.org/grpc/credentials/insecure
google.golang.org/grpc/binarylog/grpc_binarylog_v1
google.golang.org/grpc/internal/status
google.golang.org/grpc/resolver
google.golang.org/grpc/status
google.golang.org/grpc/peer
google.golang.org/grpc/internal
google.golang.org/grpc/internal/binarylog
google.golang.org/grpc/balancer
google.golang.org/grpc/internal/metadata
google.golang.org/grpc/balancer/grpclb/state
google.golang.org/grpc/internal/resolver/passthrough
google.golang.org/grpc/balancer/base
google.golang.org/grpc/internal/serviceconfig
google.golang.org/grpc/internal/resolver/dns
google.golang.org/grpc/balancer/roundrobin
google.golang.org/grpc/internal/balancer/gracefulswitch
google.golang.org/grpc/internal/transport/networktype
google.golang.org/grpc/internal/resolver
github.com/hyperledger/fabric-protos-go/ledger/queryresult
google.golang.org/grpc/internal/resolver/unix
"

不过, 有常规无法访问的问题, 应该如何在进入容器后先设定一些环境变量, 来使用国内代理呢?

wefantasy commented 2 years ago

在打包前的链码目录中生成 vendor 文件夹,应该可以不设置代理直接访问

ZoomQuiet commented 2 years ago

在打包前的链码目录中生成 vendor 文件夹,应该可以不设置代理直接访问

@wefantasy 多谢提醒, 之前注意到这种差异,

通过:

GO111MODULE=on go mod vendor go mod tidy

已经重建了 vendor 目录, 尝试解开打包的代码也观察到所有依赖:

$ cat metadata.json {"path":"github.com/hyperledger/k8s2hlf/FabricLearn/2_FabricNetworkUpdate/asset-transfer-basic/chaincode-go","type":"golang","label":"basic_1"}

wefantasy commented 2 years ago

@ZoomQuiet 是的,之后所有链码都建议如此打包

ZoomQuiet commented 2 years ago

@wefantasy 多谢确认, 不过, 这样形成的 .tar.gz chaincode 包, 无法成功安装到 peer 哪... 这种情况应该怎么想呢?

从官方 fabric-samples 中, 对应分支里复制出 fabcar 代码, 找到对应指令, 尝试安装 java 版本的 $peer lifecycle chaincode package fabcar.tar.gz --path asset-transfer-basic/fabcar/java/build/install/fabcar/ --lang java --label fabcar_1

$peer lifecycle chaincode install fabcar.tar.gz Error: chaincode install failed with status: 500 - failed to invoke backing implementation of 'InstallChaincode': could not build chaincode: docker build failed: docker image build failed: docker build failed: Error returned from build: 1 "standard_init_linux.go:228: exec user process caused: exec format error "

也类似500错误...

wefantasy commented 2 years ago

@ZoomQuiet 似乎还是因为不同架构、平台导致的兼容问题,链码和流程应该是没问题的