如何为修改后的Hyperledger Fabric代码生成新Docker镜像?
我刚修改了Hyperledger Fabric的代码,想通过docker-compose运行测试。执行make peer; make docker后看到如下输出:
mkdir -p build/image/peer/payload cp build/docker/bin/peer build/sampleconfig.tar.bz2 build/image/peer/payload mkdir -p build/image/orderer/payload cp build/docker/bin/orderer build/sampleconfig.tar.bz2 build/image/orderer/payload mkdir -p build/image/testenv/payload cp build/docker/bin/orderer build/docker/bin/peer build/sampleconfig.tar.bz2 images/testenv/install-softhsm2.sh build/image/testenv/payload mkdir -p build/image/tools/payload cp build/docker/bin/cryptogen build/docker/bin/configtxgen build/docker/bin/configtxlator build/docker/bin/peer build/sampleconfig.tar.bz2 build/image/tools/payload
但执行docker images后,仍显示3周前的旧镜像:
hyperledger/fabric-orderer latest 391b202306fa 3 weeks ago 180MB hyperledger/fabric-orderer x86_64-1.1.0 391b202306fa 3 weeks ago 180MB hyperledger/fabric-peer latest e0f3bdb4506f 3 weeks ago 187MB hyperledger/fabric-peer x86_64-1.1.0 e0f3bdb4506f 3 weeks ago 187MB
我用的是Ubuntu 16.04系统,请问遗漏了哪些步骤才能生成新的Docker镜像?
问题分析
你看到的输出只是构建脚本将编译好的二进制文件和配置复制到镜像构建目录的步骤,但Docker镜像的实际构建过程可能没触发,或者被缓存机制跳过了。下面是具体的解决步骤:
解决步骤
1. 清理旧构建产物,重新全量编译
首先清理之前的编译缓存和构建文件,确保新修改的代码被完全编译:
make clean make all docker
make all会编译所有核心组件(peer、orderer、工具等),make docker会基于最新的二进制文件构建镜像。执行过程中你应该能看到类似docker build -t hyperledger/fabric-peer:latest ...的日志,这才是镜像真正的构建环节。
2. 强制跳过Docker缓存构建镜像
如果make docker还是没更新镜像,大概率是Docker的缓存机制在作祟——Docker会检查构建上下文的文件哈希,如果没变化就复用旧镜像。你可以手动进入对应镜像的构建目录,强制构建:
- 构建peer镜像:
cd build/image/peer docker build --no-cache -t hyperledger/fabric-peer:latest . - 构建orderer镜像:
cd ../orderer docker build --no-cache -t hyperledger/fabric-orderer:latest . - 同理,tools、testenv镜像也可以按此方式强制构建。
3. 验证新镜像是否生成
执行docker images,查看hyperledger/fabric-peer和hyperledger/fabric-orderer的创建时间,应该显示为刚刚构建的时间。另外可以通过运行容器验证修改是否生效:
docker run --rm hyperledger/fabric-peer peer version
如果你的修改涉及版本信息或自定义逻辑,这里应该能看到变化。
4. 用新镜像启动docker-compose服务
如果之前运行过旧的容器,需要先彻底清理旧资源,避免复用旧容器或卷:
docker-compose down -v
然后再启动服务:
docker-compose up -d
确保你的docker-compose.yml里引用的是latest标签的本地镜像,而不是指定了旧版本号的镜像。
额外注意事项
- Docker版本检查:Ubuntu 16.04默认的Docker版本可能偏低,Hyperledger Fabric 1.1.0要求Docker 1.13.1及以上。可以执行
docker --version检查,版本不够的话建议升级Docker。 - 权限问题:确保当前用户在docker用户组里,避免
make docker或docker命令因权限不足失败。如果之前用sudo执行过,可能导致构建目录权限异常,需要修复目录权限:sudo chown -R $USER:$USER $GOPATH/src/github.com/hyperledger/fabric
内容的提问来源于stack exchange,提问作者tallharish

