Skip to content

Commit

Permalink
[BUILD] Refactor make to simplify rules
Browse files Browse the repository at this point in the history
It is not strictly necessary to create the -src base image
since we can just use a volume mount in its place. There is
also quite a bit of repetition in the build process right
now.  Therefore, this patch refactors the build to eliminate
the -src image as well as consolidates/simplifies a few things.

This sets the stage for more precise Dockerfile tunings
(such as EXPOSE/CMD on a per-daemon basis)

Change-Id: Ib0ff8e461eb4ba661b201eb519609b3f35ceab13
Signed-off-by: Greg Haskins <gregory.haskins@gmail.com>
  • Loading branch information
ghaskins committed Nov 21, 2016
1 parent 6d24ea7 commit 5dbd1f0
Show file tree
Hide file tree
Showing 7 changed files with 50 additions and 71 deletions.
92 changes: 31 additions & 61 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,9 @@ K := $(foreach exec,$(EXECUTABLES),\

GOSHIM_DEPS = $(shell ./scripts/goListFiles.sh $(PKGNAME)/core/chaincode/shim | sort | uniq)
JAVASHIM_DEPS = $(shell git ls-files core/chaincode/shim/java)
PROTOS = $(shell git ls-files *.proto | grep -v vendor)
PROJECT_FILES = $(shell git ls-files)
IMAGES = src ccenv peer javaenv orderer
IMAGES = peer orderer ccenv javaenv

pkgmap.peer := $(PKGNAME)/peer
pkgmap.orderer := $(PKGNAME)/orderer
Expand Down Expand Up @@ -132,22 +133,18 @@ build/bin/chaintool: Makefile
@mkdir -p $(@D)
@cp $^ $@

# JIRA FAB-243 - Mark build/docker/bin artifacts explicitly as secondary
# since they are never referred to directly. This prevents
# the makefile from deleting them inadvertently.
.SECONDARY: build/docker/bin/peer build/docker/bin/orderer

# We (re)build a package within a docker context but persist the $GOPATH/pkg
# directory so that subsequent builds are faster
build/docker/bin/%: build/image/src/.dummy $(PROJECT_FILES)
build/docker/bin/%: $(PROJECT_FILES)
$(eval TARGET = ${patsubst build/docker/bin/%,%,${@}})
@echo "Building $@"
@mkdir -p build/docker/bin build/docker/pkg
@docker run -i \
--user=$(UID) \
-v $(abspath build/docker/bin):/opt/gopath/bin \
-v $(abspath build/docker/pkg):/opt/gopath/pkg \
hyperledger/fabric-src:$(DOCKER_TAG) \
-v $(abspath .):/opt/gopath/src/$(PKGNAME) \
hyperledger/fabric-baseimage:$(BASE_DOCKER_TAG) \
go install -ldflags "$(GO_LDFLAGS)" $(pkgmap.$(@F))
@touch $@

Expand All @@ -165,76 +162,49 @@ build/bin/%: $(PROJECT_FILES)
@echo "Binary available as $@"
@touch $@

# Special override for src-image
build/image/src/.dummy: $(PROJECT_FILES)
@echo "Building docker src-image"
@mkdir -p $(@D)
@cat images/src/Dockerfile.in \
| sed -e 's/_BASE_TAG_/$(BASE_DOCKER_TAG)/g' \
| sed -e 's/_TAG_/$(DOCKER_TAG)/g' \
> $(@D)/Dockerfile
@git ls-files | tar -jcT - > $(@D)/gopath.tar.bz2
docker build -t $(PROJECT_NAME)-src $(@D)
docker tag $(PROJECT_NAME)-src $(PROJECT_NAME)-src:$(DOCKER_TAG)
@touch $@

# Special override for ccenv-image (chaincode-environment)
build/image/ccenv/.dummy: build/image/ccenv/bin/protoc-gen-go build/image/ccenv/bin/chaintool build/image/ccenv/goshim.tar.bz2 Makefile
@echo "Building docker ccenv-image"
@cat images/ccenv/Dockerfile.in \
| sed -e 's/_BASE_TAG_/$(BASE_DOCKER_TAG)/g' \
| sed -e 's/_TAG_/$(DOCKER_TAG)/g' \
> $(@D)/Dockerfile
docker build -t $(PROJECT_NAME)-ccenv $(@D)
docker tag $(PROJECT_NAME)-ccenv $(PROJECT_NAME)-ccenv:$(DOCKER_TAG)
@touch $@

# Special override for java-image
# Following items are packed and sent to docker context while building image
# 1. Java shim layer source code
# 2. Proto files used to generate java classes
# 3. Gradle settings file
build/image/javaenv/.dummy: Makefile $(JAVASHIM_DEPS)
@echo "Building docker javaenv-image"
@mkdir -p $(@D)
@cat images/javaenv/Dockerfile.in \
| sed -e 's/_BASE_TAG_/$(BASE_DOCKER_TAG)/g' \
| sed -e 's/_TAG_/$(DOCKER_TAG)/g' \
> $(@D)/Dockerfile
# Following items are packed and sent to docker context while building image
# 1. Java shim layer source code
# 2. Proto files used to generate java classes
# 3. Gradle settings file
@git ls-files core/chaincode/shim/java | tar -jcT - > $(@D)/javashimsrc.tar.bz2
@git ls-files protos core/chaincode/shim/table.proto settings.gradle | tar -jcT - > $(@D)/protos.tar.bz2
docker build -t $(PROJECT_NAME)-javaenv $(@D)
docker tag $(PROJECT_NAME)-javaenv $(PROJECT_NAME)-javaenv:$(DOCKER_TAG)
@touch $@
# payload definitions'
build/image/ccenv/payload: build/docker/bin/protoc-gen-go \
build/bin/chaintool \
build/goshim.tar.bz2
build/image/javaenv/payload: build/javashim.tar.bz2 \
build/protos.tar.bz2 \
settings.gradle
build/image/peer/payload: build/docker/bin/peer \
peer/core.yaml \
msp/peer-config.json
build/image/orderer/payload: build/docker/bin/orderer \
orderer/orderer.yaml

build/image/%/payload:
mkdir -p $@
cp $^ $@

# Default rule for image creation
build/image/%/.dummy: build/image/src/.dummy build/docker/bin/%
build/image/%/.dummy: Makefile build/image/%/payload
$(eval TARGET = ${patsubst build/image/%/.dummy,%,${@}})
@echo "Building docker $(TARGET)-image"
@mkdir -p $(@D)/bin
@cat images/app/Dockerfile.in \
@cat images/$(TARGET)/Dockerfile.in \
| sed -e 's/_BASE_TAG_/$(BASE_DOCKER_TAG)/g' \
| sed -e 's/_TAG_/$(DOCKER_TAG)/g' \
> $(@D)/Dockerfile
cp build/docker/bin/$(TARGET) $(@D)/bin
docker build -t $(PROJECT_NAME)-$(TARGET) $(@D)
docker tag $(PROJECT_NAME)-$(TARGET) $(PROJECT_NAME)-$(TARGET):$(DOCKER_TAG)
@touch $@

%/goshim.tar.bz2: $(GOSHIM_DEPS) Makefile
build/goshim.tar.bz2: $(GOSHIM_DEPS)
@echo "Creating $@"
@tar -jhc -C $(GOPATH)/src $(patsubst $(GOPATH)/src/%,%,$(GOSHIM_DEPS)) > $@

build/javashim.tar.bz2: $(JAVASHIM_DEPS)
build/protos.tar.bz2: $(PROTOS)

build/%.tar.bz2:
@echo "Creating $@"
@tar -jc $^ > $@

.PHONY: protos
protos: gotools
./scripts/compile_protos.sh

src-image-clean: ccenv-image-clean peer-image-clean orderer-image-clean

%-image-clean:
$(eval TARGET = ${patsubst %-image-clean,%,${@}})
-docker images -q $(PROJECT_NAME)-$(TARGET) | xargs docker rmi -f
Expand Down
4 changes: 0 additions & 4 deletions images/app/Dockerfile.in

This file was deleted.

4 changes: 2 additions & 2 deletions images/ccenv/Dockerfile.in
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
FROM hyperledger/fabric-baseimage:_BASE_TAG_
COPY bin/* /usr/local/bin/
ADD goshim.tar.bz2 $GOPATH/src/
COPY payload/chaintool payload/protoc-gen-go /usr/local/bin/
ADD payload/goshim.tar.bz2 $GOPATH/src/
5 changes: 3 additions & 2 deletions images/javaenv/Dockerfile.in
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,9 @@ FROM openjdk:8
RUN wget https://services.gradle.org/distributions/gradle-2.12-bin.zip -P /tmp --quiet
RUN unzip -q /tmp/gradle-2.12-bin.zip -d /opt && rm /tmp/gradle-2.12-bin.zip
RUN ln -s /opt/gradle-2.12/bin/gradle /usr/bin
ADD javashimsrc.tar.bz2 /root
ADD protos.tar.bz2 /root
ADD payload/javashim.tar.bz2 /root
ADD payload/protos.tar.bz2 /root
ADD payload/settings.gradle /root
WORKDIR /root
# Build java shim after copying proto files from fabric/proto
RUN core/chaincode/shim/java/javabuild.sh
7 changes: 7 additions & 0 deletions images/orderer/Dockerfile.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
FROM hyperledger/fabric-baseimage:_BASE_TAG_
RUN mkdir -p /var/hyperledger/db /etc/hyperledger/fabric
COPY payload/orderer /usr/local/bin
COPY payload/orderer.yaml /etc/hyperledger/fabric
WORKDIR /etc/hyperledger/fabric
EXPOSE 5151
CMD orderer
7 changes: 7 additions & 0 deletions images/peer/Dockerfile.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
FROM hyperledger/fabric-baseimage:_BASE_TAG_
ENV PEER_CFG_PATH /etc/hyperledger/fabric
RUN mkdir -p /var/hyperledger/db $PEER_CFG_PATH/msp
COPY payload/peer /usr/local/bin
COPY payload/core.yaml $PEER_CFG_PATH
COPY payload/peer-config.json $PEER_CFG_PATH/msp
CMD peer node start
2 changes: 0 additions & 2 deletions images/src/Dockerfile.in

This file was deleted.

0 comments on commit 5dbd1f0

Please sign in to comment.