(转)EOSIO开发(一)使用Docker构建本地环境
前言
一直想学习EOS开发,但是不知道怎么入门。最近从GitHub上下载了源码,发现官方已经提供了完整的EOSIO开发入门教程,既然如此赶紧开始行动。今天是系列文章的第一篇,介绍如何使用Docker搭建本地环境。
选择构建方式
官方支持两种方式搭建本地环境
- 使用源码
- 使用Docker
我个人首选Docker,因为可以将与EOSIO相关的软件、环境都封装在一个镜像中,不管是出了问题要回退,还是学完以后删除相关的软件,Docker都很方便。
所以在这篇文章中我就不介绍怎么使用源码构建了,有兴趣的同学可以参考官方文档的Building EOSIO章节。
前期准备
- 下载源码(https://github.com/EOSIO/eos.git)
- 下载Docker(17.05或者以上版本)
- 下载docker-compose(1.10.0或者以上版本)
- 打开EOSIO Readme文件(https://github.com/EOSIO/eos/blob/master/Docker/README.md)
EOSIO的构成
在正式开始构建之前,我们先来了解EOSIO的组成部分,官方文档对于EOSIO是这么介绍的。
EOSIO comes with a number of programs(EOSIO由下面的程序构成):
- nodeos - server-side blockchain node component(服务端的区块链节点组件)
- cleos - command line interface to interact with the blockchain(与区块链进行交互的命令行界面)
- keosd - EOSIO wallet(EOSIO钱包)
- eosio-launcher - application to assist with deploying a multi-node blockchain network(用来协助部署一个多节点区块链网络的应用程序)
中文是我自己翻译的,请原谅我的学渣翻译水平,由于对EOSIO不了解,所以只能按照字面意思硬译。翻译完之后,我发现除了keosd(EOSIO钱包),其它几个程序的作用仍然不明所以。
好在今天的任务是搭建环境,能够将这几个程序安装起来并且正常运行就可以了,各个程序的具体作用后面再做深入学习。
开始构建
参考开发文档,执行下面的命令,如果源码已下载可忽略第一行。
git clone https://github.com/EOSIO/eos.git –recursive
cd eos/Docker
docker build . -t eosio/eos
开始执行以后不需要人工干预,让机器自动运行就可以了,整个过程会持续半小时到一小时。
在执行的过程当中,我们来分析一下构建的步骤,打开eos/Docker/DockerFile 文件,可以看到下面的内容。
FROM eosio/builder as builder
RUN git clone -b master –depth 1 https://github.com/EOSIO/eos.git –recursive \
&& cd eos \
&& cmake -H. -B”/tmp/build” -GNinja -DCMAKE_BUILD_TYPE=Release -DWASM_ROOT=/opt/wasm -DCMAKE_CXX_COMPILER=clang++ \
-DCMAKE_C_COMPILER=clang -DCMAKE_INSTALL_PREFIX=/tmp/build -DSecp256k1_ROOT_DIR=/usr/local \
&& cmake –build /tmp/build –target installFROM ubuntu:16.04
RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get -y install openssl && rm -rf /var/lib/apt/lists/*
COPY –from=builder /usr/local/lib/* /usr/local/lib/
COPY –from=builder /tmp/build/bin /opt/eosio/bin
COPY –from=builder /tmp/build/contracts /contracts
COPY –from=builder /eos/Docker/config.ini /eos/genesis.json /
COPY nodeosd.sh /opt/eosio/bin/nodeosd.sh
ENV EOSIO_ROOT=/opt/eosio
RUN chmod +x /opt/eosio/bin/nodeosd.sh
ENV LD_LIBRARY_PATH /usr/local/lib
VOLUME /opt/eosio/bin/data-dir
ENV PATH /opt/eosio/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
整个构建过程可以分成下面几个步骤:
- 下载eosio/builder镜像。这个镜像包含了EOSIO运行时需要的各种软件和配置信息。
- 编译生成可执行文件并安装。这一步与直接使用源码构建环境是一样的,环境参数可能会有细微差别。
- 下载ubuntu镜像。看来Docker环境使用的是Ubuntu系统16.04版本。
- 安装软件,拷贝配置信息,设置环境变量等等。
构建失败
正当我以为构建会很顺利的时候,命令行上出现一条错误信息: 
在执行”COPY –from=builder /eos/Docker/config.ini /eos/genesis.json /” 语句时出错,eos/genesis.json文件不存在。
这就奇怪了,难道官方开发人员自己没有跑过构建脚本?还是我本地环境的原因导致的错误?
我尝试着将DockerFile中的”eos/genesis.json / “替换成”eos/genesis.json”,因为结尾那个多余的 / 看着非常可疑,与前面的地址中间隔了一个空格。
修改之后没有报错,构建成功并且生成了镜像,但是在启动镜像时出现异常,此法不通。
我又另外尝试了几个方法,仍然无法生成正确的镜像,无奈之下,我去GitHub上提交了一个Bug,看看官方开发人员怎么说。

然并卵,只有两个同病相怜的小伙伴说跟我遇到了一样的问题,官方开发人员并没有答复。

生成不了正确的镜像,难道我的EOS开发之旅要就此夭折?
当然不会,否则我也没必要写今天这篇文章了,正所谓条条大路通罗马,自己生成不了镜像,就拿官方已经生成好的。
下载eosio/eos镜像
还记得前面执行的命令么
docker build . -t eosio/eos
这句话的意思是让我们生成一个名为eosio/eos的镜像文件,在Docker的命名习惯下,eosio/eos对应了Docker公共仓库eosio命名空间下的eos仓库。也就是说,EOS官方很有可能已经把编译好的镜像文件上传到Docker公共仓库中。
事实是否如此?我尝试做了以下操作。
1.删除本地异常的eosio/eos镜像
docker rmi e7bc2acf31bf

2.下载eosio/eos镜像
docker pull eosio/eos

还真让我下载到了。
环境验证
下载好了镜像,我们来进一步验证该镜像是否可用,不管是自己生成的镜像,还是从Docker仓库下载的,下面的验证步骤都是一样的。
参考开发文档Start nodeos docker container only章节。
1.启动一个nodeos节点
docker run –name nodeos -p 8888:8888 -p 9876:9876 -t eosio/eos nodeosd.sh arg1 arg2

启动成功
2.验证nodeos节点是否可用

验证通过
3.同时启动nodeos和kesod节点
docker volume create –name=nodeos-data-volume
docker volume create –name=keosd-data-volume
docker-compose -f docker-compose.yml up "-d"

这一步要注意几点:
- 执行命令前先把第1步启动的nodeos节点停掉
- docker-compose命令相关的配置信息在/eos/Docker/docker-compose.yml文件中
- 官方文档是说启动nodeos和kesod两个节点,但实际上还启动了builder节点,经过测试这个节点是没有用的,大家可以从docker-compose.yml文件中将builder节点相关的配置信息删掉。
4.执行cleos命令
先设置cleos环境变量/etc/profile
export PATH=$PATH:/root/eos/build/programs/nodeos
export PATH=$PATH:/root/eos/build/programs/cleos
然后执行cleos命令,测试eos安装环境
cleos get info
cleos get account inita

注意head_block_num的值时10239,在前面验证nodeos节点是否可用时,返回的head_block_num是711,这说明nodeos节点已经在自动生成区块了。
至此环境验证完毕,部署成功。
小结
整个环境构建过程并不复杂,开发文档已经写得比较清楚,顺利的话1到2个小时可以完成。
不过大家还是要注意随机应变,不能完全依赖开发文档,比如当我遇到生成镜像失败的问题时,直接从Docker仓库下载镜像,这一点EOS的开发文档中是没有的。
另外还有一点要注意,开发文档的内容变动很频繁。我刚开始看文档的时候,还是在 https://github.com/EOSIO/eos 里面,不知什么时候开始就变到 https://github.com/EOSIO/eos/wiki 里面,目录结构也变了。
最后还是要吐槽一下EOS官方开发人员
- 既然可以直接下载镜像,干嘛还让我们自己构建,太浪费时间。
- 让我们自己构建就算了,能不能测一下构建脚本,没有BUG了再上传?
今天中午在GitHub看到昨天提交的BUG已经Close,官方开发人员的回复是:已经删除genesis.json文件。我还没有测试,希望这次修改之后不会再有新的问题。

转自:https://blog.csdn.net/wanf425/article/details/80716316
(转)EOSIO开发(一)使用Docker构建本地环境的更多相关文章
- docker构建测试环境
构建测试环境首先要根据自己的需求,构建出适合自己项目的image,有了自己的image,就可以快速的搭建出来一套测试环境了. 下边就说一下构建image的两种方式. 1.DOCKFILE创建文件夹:m ...
- Docker 构建Hadoop环境
参考如下文章: Docker安装Hadoop Docker在本地搭建Hadoop分布式集群 Docker快速搭建Hadoop测试环境 从0开始用docker搭建 hadoop分布式环境 Docker- ...
- docker构建本地仓库后,无法登陆解决办法(CentOS/Ubuntu)
docker版本为:Server Version: 1.12.6 从dockerhub上下载最新的registry镜像. 首先.构建registry 1.下载registry镜像 docker pul ...
- springboot~maven集成开发里的docker构建
统一设计 maven很好的把项目整合在一起,在部署时,每个项目可以有自己的Dockerfile,在构建后把对应的jar包复制到Dockerfile的同级目录,使用使用统一的打包镜像和容器启动方法去执行 ...
- 基于docker构建测试环境
目录 0x01介绍 0x02 镜像基本操作 0x03 容器基本操作 0x04 容器的修改与保存 0x05 使用Dockerfile定制镜像 0x01介绍 Docker 是一个开源的应用容器引擎,基于 ...
- Docker构建JDK环境
创建目录mkdir oracle-jdk 构建文件touch Dockerfile # Docker for jdk-8u181 FROM centos:7 MAINTAINER ggza " ...
- docker构建Java环境
FROM java:7 COPY . /usr/src/javaapp WORKDIR /usr/src/javaapp RUN javac HelloWorld.java CMD ["ja ...
- spring boot / cloud (十八) 使用docker快速搭建本地环境
spring boot / cloud (十八) 使用docker快速搭建本地环境 在平时的开发中工作中,环境的搭建其实一直都是一个很麻烦的事情 特别是现在,系统越来越复杂,所需要连接的一些中间件也越 ...
- 使用docker快速搭建本地环境
在平时的开发中工作中,环境的搭建其实一直都是一个很麻烦的事情 特别是现在,系统越来越复杂,所需要连接的一些中间件也越来越多. 然而要顺利的安装好这些中间件也是一个比较费时费力的工作. 俗话说" ...
随机推荐
- hadoop程序实例
安装了Eclipse及hadoop-eclipse-plugin后学着<hadoop权威指南>中的气温例子写了一个输出气温的程序,数据是我自己简单写的,但是输出却不是我预想的,这中间还有很 ...
- 设计模式学习--Singleton
What Singleton:保证一个类仅有一个实例,并提供一个访问它的全局访问点. Why Singletion是我比较熟悉的设计模式之一,在平常的开发过程中,也曾几次用到,它主要适用于如下场景: ...
- Nginx作为TCP负载均衡
参考文档:https://www.cnblogs.com/stimlee/p/6243055.html Nginx在1.9版本以后支持TCP负载均衡,模块默认是没有编译的,需要编译时添加—with-s ...
- 没有上司的舞会|codevs1380|luoguP1352|树形DP|Elena
没有上司的舞会 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Ural大学有N个职员,编号为1~N.他们有从属关系 ...
- {django模型层(二)多表操作}一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询、分组查询、F查询和Q查询
Django基础五之django模型层(二)多表操作 本节目录 一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询.分组查询.F查询和Q查询 六 xxx 七 ...
- [No0000108]Git1/9-Git简介与入门
Git是什么? Git是目前世界上最先进的分布式版本控制系统(没有之一). Git有什么特点?简单来说就是:高端大气上档次! 那什么是版本控制系统? 如果你用Microsoft Word写过长篇大论, ...
- “对外部(局部)变量的访问”是C语言函数指针的最大弱点
1.“对外部(局部)变量的访问”是C语言函数指针的最大弱点 . #include <stdio.h> #include <stdlib.h> /* 结构体定义 */ struc ...
- Java 输入/输出——File类
File类是java.io包下代表与平台无关的文件和目录,也就是说,如果希望在程序中操作文件和目录,都可以通过File类来完成.值得指出的是,不管是文件还是目录都是使用File来操作的,File能新建 ...
- 中位数&贪心
谁能想到基本算法就这么难呢?我想去冲省选,但是迟迟在这些地方 花时间 算是提升自己的思维算了. 这道题呢 答案其实很简单每个数在a的位置和在b的位置之差的累加/2即是答案为什么呢?考虑当前数字 要向后 ...
- 如何通过钉钉扫码登录odoo
更加方便快捷的登录odoo,实现免密码登录,有需要此模块朋友加我微信18310744639 1.首先你需要一个钉钉管理员权限,以便获取appid, appsecret,corpid, corpsecr ...