Windows探索体验长安链Golang智能合约02

430 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第5天,点击查看活动详情

本文已参与「开源摘星计划」,欢迎正在阅读的你加入。活动链接:github.com/weopenproje…

根据上文,我们已经实现了在Docker内使用Docker

使用Docker cp命令将配置好DockerGo虚拟机的长安链复制进节点服务器内,按照管理台的教程,解压缩后运行:

image.png

可以看到,得到了DockerGo虚拟机的容器节点。查看下长安链的日志,检查是否运行正常:

image.png

根据日志显示,长安链连接不上合约虚拟机,并一直在循环重试。

遇到这个情况,不要惊慌,冷静分析。首先要确定DockerGo虚拟机是否运行正常,这需要找到相应的日志。在长安链部署文件中,找到DockerGo虚拟机的启动脚本:

vim TestCMorg1-示例测试节点1/bin/docker_start.sh

可以看到关于DockerGo虚拟机启动的部分:

docker run -itd \
  --net=host \
  -v "$mount_path":/mount \
  -v "$log_path":/log \
  -e CHAIN_RPC_PROTOCOL="1" \
  -e CHAIN_RPC_PORT="$chainmaker_vm_go_contract_engine_port" \
  -e SANDBOX_RPC_PORT="$chainmaker_vm_go_runtime_server_port" \
  -e MAX_SEND_MSG_SIZE="$chainmaker_vm_go_max_send_msg_size" \
  -e MAX_RECV_MSG_SIZE="$chainmaker_vm_go_max_recv_msg_size" \
  -e MAX_CONN_TIMEOUT="$chainmaker_vm_go_dial_timeout" \
  -e MAX_ORIGINAL_PROCESS_NUM="$chainmaker_vm_go_max_concurrency" \
  -e DOCKERVM_CONTRACT_ENGINE_LOG_LEVEL="$chainmaker_vm_go_log_level" \
  -e DOCKERVM_SANDBOX_LOG_LEVEL="$chainmaker_vm_go_log_level" \
  -e DOCKERVM_LOG_IN_CONSOLE="$chainmaker_vm_go_log_in_console" \
  --name VM-GO-TestCMorg1 \
  --privileged $VM_GO_IMAGE_NAME \
  > /dev/null

其他参数我们先不管,命令中使用-v参数挂载了两个目录。可以看到,其中/log就是要找的日志位置。

由于$log_path是指的节点服务器的某个路径,而我们通过上一章的骚操作,这里使用的Docker实际是主机的。所以DockerGo虚拟机永远也找不到这个路径。。

所以,这里将挂载日志的配置先删除,让日志直接记录在容器内的文件系统上。修改完后,保存退出。重新启动下我们的长安链。

在新获得的DockerGo虚拟机容器内,可以看到我们想见的日志文件:

image.png

查看内容,确定虚拟机是否启动成功:

image.png

提示failed to setCGroup。这个cgroup是啥,推荐美团技术团队的文章

我们关心的是,这里为啥会设置失败呢?原来,官方文档早已经说明了:

image.png

有的小伙伴可能会问了,咱这不是用Docker技术操作上了Linux系统么?答案是,容器内的cgroup并不是完全体的cgroup,是阉割过的。真正完全体的cgroup需要Docker主机通过挂载的方式挂到容器内。

那么有没有什么其他办法呢?下一章继续我们的探索。