本系列文章:


第一章:九析带你完爆 hyperledger fabric - 快速上手 basic-network 样例

第二章:九析带你完爆 hyperledger fabric - 快速搭建 GO 环境

第三章:九析带你完爆 hyperledger fabric - 快速上手 first-network 样例

第四章:九析带你完爆 hyperledger fabric - 系统逻辑架构篇

第五章:九析带你完爆 hyperledger fabirc - 网络节点介绍

第六章:  九析带你轻松完爆 hyperledger fabric - 区块和区块链介绍

第七章:  九析带你轻松完爆 hyperledger fabric - 区块链防篡改机制

第八章:九析带你轻松完爆 hyperledger fabric - Couchdb 安装

第九章:九析带你轻松完爆 hyperledger fabric - NVM 和 Nodejs 安装

第十章:九析带你轻松完爆 hyperledger fabric - chaincode 生命周期介绍

第十一章: 九析带你轻松完爆 hyperledger fabric - 创建联盟

第十二章: 九析带你轻松完爆 hyperledger fabric - configtxlator 尝鲜

第十三章: 九析带你轻松完爆 hyperledger fabric - 创建静态组织

第十四章: 九析带你轻松完爆 WARNING: The COMPOSE_PROJECT_NAME

第十五章: 九析带你轻松完爆 hyperledger fabric - chaincode 链码调用

第十六章: 九析带你轻松完爆 hyperledger fabric - 背书策略 Polic

第十七章: 九析带你轻松完爆 hyperledger fabric - 链码初始化容器时区修改


1 前言

        如果你对博客有任何疑问,请加微信沟通:


2 问题描述

        在将 hyperledger fabric 迁移到 k8s 容器的过程中,其中有关键的一步就是初始化链码操作。

peer chaincode instantiate -o blockchain-orderer:31010 -C ${CHANNEL_NAME} -n ${CHAINCODE_NAME} -v ${CHAINCODE_VERSION} -c '{\"Args\":[\"init\",\"a\",\"100\",\"b\",\"200\"]}'

        fabric 在 k8s 中初始化链码的整个过程是 client (比如:fabric-tools)向 orderer 发出申请,orderer 将此申请打包发送给 peer 节点,peer 节点会跟宿主机 docker 通信发送创建容器请求,宿主机 docker 收到请求后根据指定镜像运行成链码容器。

        这里容易晕眩的点在于,熟悉 k8s 环境的人都知道 k8s 底层容器引擎是 docker,但是使用 k8s 的过程中我们很少直接通过 docker run 去产生容器的,而通常的做法是使用 kubectl 去向 api-server 发送资源管理请求去操作 pod。但是在初始化 fabric 链码的过程中,却是 k8s 中 peer 所在的 pod 直接跟宿主机的 docker 通信,直接利用宿主机 docker 去动态生成链码容器。

        由于是动态生成链码容器,所以就不能很随意地的去 mount 宿主机的时区 /etc/localtime。那么解决问题的关键就需要定位动态启动链码时所引用的镜像。可是这个镜像到底是谁呢?

spacer.gif


3 问题解决

3.1 编写 Dockerfile 文件

        Dockerfile 文件内容如下,我想我不用解释什么了吧:

FROM hyperledger/fabric-baseos:amd64-0.4.18

RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone

3.2 创建镜像

docker build -t hyperledger/fabric-baseos:amd64-0.4.18 .


4 关注点

        需要注意,此镜像必须要在 peer 所在节点上,如果你重新启动 fabric 区块链网络时,peer 节点会飘到不知道哪个 worker 节点上,所以稳妥起见,你需要将此镜像通过如下语句手动发布在 k8s 所有 worker 节点之上。

docker save -o baseos.tar hyperledger/fabric-baseos:amd64-0.4.18

docker load -i baseos.tar

        自此,九析带你轻松完爆了链码初始化容器时区修改。