Skip to content

Commit

Permalink
[FAB-11096] Use Alpine for Docker images
Browse files Browse the repository at this point in the history
Please not that Node CC will not work with this
CR.  The plan is to add a fabric-nodeenv image
to the fabric-chaincode-node build.

Change-Id: Ic3cb6d7bcc0f5b644a43cd3cd8c600c2af479d2e
Signed-off-by: Gari Singh <[email protected]>
  • Loading branch information
mastersingh24 committed Dec 20, 2018
1 parent 82df1c9 commit fdd1c72
Show file tree
Hide file tree
Showing 24 changed files with 292 additions and 214 deletions.
155 changes: 51 additions & 104 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -44,10 +44,13 @@
# - docker-tag-stable - re-tags the images made by 'make docker' with the :stable tag
# - help-docs - generate the command reference docs

ALPINE_VER ?= 3.8
BASE_VERSION = 2.0.0
PREV_VERSION = 1.4.0
CHAINTOOL_RELEASE=1.1.3
BASEIMAGE_RELEASE=0.4.14
CHAINTOOL_RELEASE ?= 1.1.3
BASEIMAGE_RELEASE = 0.4.14
JAVA_VER ?= 8
NODE_VER ?= 8

# Allow to build as a submodule setting the main project to
# the PROJECT_NAME env variable, for example,
Expand Down Expand Up @@ -77,6 +80,7 @@ METADATA_VAR += BaseDockerLabel=$(BASE_DOCKER_LABEL)
METADATA_VAR += DockerNamespace=$(DOCKER_NS)
METADATA_VAR += BaseDockerNamespace=$(BASE_DOCKER_NS)

GO_VER = $(shell grep "GO_VER" ci.properties |cut -d'=' -f2-)
GO_LDFLAGS = $(patsubst %,-X $(PKGNAME)/common/metadata.%,$(METADATA_VAR))

GO_TAGS ?=
Expand All @@ -96,7 +100,7 @@ PROJECT_FILES = $(shell git ls-files | grep -v ^test | grep -v ^unit-test | \
grep -v ^.git | grep -v ^examples | grep -v ^devenv | grep -v .png$ | \
grep -v ^LICENSE | grep -v ^vendor )
RELEASE_TEMPLATES = $(shell git ls-files | grep "release/templates")
IMAGES = peer orderer ccenv buildenv tools
IMAGES = peer orderer baseos ccenv buildenv tools
RELEASE_PLATFORMS = windows-amd64 darwin-amd64 linux-amd64 linux-s390x linux-ppc64le
RELEASE_PKGS = configtxgen cryptogen idemixgen discover configtxlator peer orderer

Expand Down Expand Up @@ -149,13 +153,21 @@ include gotools.mk
.PHONY: gotools
gotools: gotools-install

tools-docker: $(BUILD_DIR)/images/tools/$(DUMMY)

buildenv: $(BUILD_DIR)/images/buildenv/$(DUMMY)

baseos: $(BUILD_DIR)/images/baseos/$(DUMMY)

ccenv: $(BUILD_DIR)/images/ccenv/$(DUMMY)

.PHONY: peer
peer: $(BUILD_DIR)/bin/peer
peer-docker: $(BUILD_DIR)/image/peer/$(DUMMY)
peer-docker: $(BUILD_DIR)/images/peer/$(DUMMY)

.PHONY: orderer
orderer: $(BUILD_DIR)/bin/orderer
orderer-docker: $(BUILD_DIR)/image/orderer/$(DUMMY)
orderer-docker: $(BUILD_DIR)/images/orderer/$(DUMMY)

.PHONY: configtxgen
configtxgen: GO_LDFLAGS=-X $(pkgmap.$(@F))/metadata.CommitSHA=$(EXTRA_VERSION)
Expand All @@ -173,17 +185,11 @@ idemixgen: $(BUILD_DIR)/bin/idemixgen
discover: GO_LDFLAGS=-X $(pkgmap.$(@F))/metadata.Version=$(PROJECT_VERSION)
discover: $(BUILD_DIR)/bin/discover

tools-docker: $(BUILD_DIR)/image/tools/$(DUMMY)

buildenv: $(BUILD_DIR)/image/buildenv/$(DUMMY)

ccenv: $(BUILD_DIR)/image/ccenv/$(DUMMY)

.PHONY: integration-test
integration-test: gotool.ginkgo ccenv docker-thirdparty
integration-test: gotool.ginkgo ccenv baseos docker-thirdparty
./scripts/run-integration-tests.sh

unit-test: unit-test-clean peer-docker docker-thirdparty ccenv
unit-test: unit-test-clean peer-docker docker-thirdparty ccenv baseos
unit-test/run.sh

unit-tests: unit-test
Expand All @@ -200,7 +206,7 @@ profile: unit-test
test-cmd:
@echo "go test -tags \"$(GO_TAGS)\""

docker: $(patsubst %,$(BUILD_DIR)/image/%/$(DUMMY), $(IMAGES))
docker: $(patsubst %,$(BUILD_DIR)/images/%/$(DUMMY), $(IMAGES))

native: peer orderer configtxgen cryptogen idemixgen configtxlator discover

Expand All @@ -220,108 +226,49 @@ generate-metrics-doc: buildenv
@echo "Generating metrics reference documentation..."
@$(DRUN) $(DOCKER_NS)/fabric-buildenv:$(DOCKER_TAG) ./scripts/metrics_doc.sh generate

$(BUILD_DIR)/%/chaintool: Makefile
@echo "Installing chaintool"
@mkdir -p $(@D)
curl -fL $(CHAINTOOL_URL) > $@
chmod +x $@

# We (re)build a package within a docker context but persist the $GOPATH/pkg
# directory so that subsequent builds are faster
$(BUILD_DIR)/docker/bin/%: $(PROJECT_FILES)
$(eval TARGET = ${patsubst $(BUILD_DIR)/docker/bin/%,%,${@}})
@echo "Building $@"
@mkdir -p $(BUILD_DIR)/docker/bin $(BUILD_DIR)/docker/$(TARGET)/pkg
@$(DRUN) \
-v $(abspath $(BUILD_DIR)/docker/bin):/opt/gopath/bin \
-v $(abspath $(BUILD_DIR)/docker/$(TARGET)/pkg):/opt/gopath/pkg \
$(BASE_DOCKER_NS)/fabric-baseimage:$(BASE_DOCKER_TAG) \
go install -tags "$(GO_TAGS)" -ldflags "$(DOCKER_GO_LDFLAGS)" $(pkgmap.$(@F))
@touch $@

$(BUILD_DIR)/bin:
mkdir -p $@

changelog:
./scripts/changelog.sh v$(PREV_VERSION) v$(BASE_VERSION)

$(BUILD_DIR)/docker/gotools/bin/protoc-gen-go: $(BUILD_DIR)/docker/gotools

$(BUILD_DIR)/docker/gotools: gotools.mk
@echo "Building dockerized gotools"
@mkdir -p $@/bin $@/obj
@$(DRUN) \
-v $(abspath $@):/opt/gotools \
-w /opt/gopath/src/$(PKGNAME) \
$(BASE_DOCKER_NS)/fabric-baseimage:$(BASE_DOCKER_TAG) \
make -f gotools.mk GOTOOLS_BINDIR=/opt/gotools/bin GOTOOLS_GOPATH=/opt/gotools/obj
$(BUILD_DIR)/bin:
@mkdir -p $@

$(BUILD_DIR)/bin/%: $(PROJECT_FILES)
$(BUILD_DIR)/bin/%:
@mkdir -p $(@D)
@echo "$@"
$(CGO_FLAGS) GOBIN=$(abspath $(@D)) go install -tags "$(GO_TAGS)" -ldflags "$(GO_LDFLAGS)" $(pkgmap.$(@F))
@echo "Binary available as $@"
@touch $@

# payload definitions'
$(BUILD_DIR)/image/ccenv/payload: $(BUILD_DIR)/docker/gotools/bin/protoc-gen-go \
$(BUILD_DIR)/bin/chaintool \
$(BUILD_DIR)/goshim.tar.bz2
$(BUILD_DIR)/image/peer/payload: $(BUILD_DIR)/docker/bin/peer \
$(BUILD_DIR)/sampleconfig.tar.bz2
$(BUILD_DIR)/image/orderer/payload: $(BUILD_DIR)/docker/bin/orderer \
$(BUILD_DIR)/sampleconfig.tar.bz2
$(BUILD_DIR)/image/buildenv/payload: $(BUILD_DIR)/gotools.tar.bz2 \
$(BUILD_DIR)/docker/gotools/bin/protoc-gen-go

$(BUILD_DIR)/image/%/payload:
mkdir -p $@
cp $^ $@

.PRECIOUS: $(BUILD_DIR)/image/%/Dockerfile

$(BUILD_DIR)/image/%/Dockerfile: images/%/Dockerfile.in
mkdir -p $(@D)
@cat $< \
| sed -e 's|_BASE_NS_|$(BASE_DOCKER_NS)|g' \
| sed -e 's|_NS_|$(DOCKER_NS)|g' \
| sed -e 's|_BASE_TAG_|$(BASE_DOCKER_TAG)|g' \
| sed -e 's|_TAG_|$(DOCKER_TAG)|g' \
> $@
@echo LABEL $(BASE_DOCKER_LABEL).version=$(BASE_VERSION) \\>>$@
@echo " " $(BASE_DOCKER_LABEL).base.version=$(BASEIMAGE_RELEASE)>>$@

$(BUILD_DIR)/image/tools/$(DUMMY): $(BUILD_DIR)/image/tools/Dockerfile
$(eval TARGET = ${patsubst $(BUILD_DIR)/image/%/$(DUMMY),%,${@}})
@echo "Building docker $(TARGET)-image"
$(DBUILD) -t $(DOCKER_NS)/fabric-$(TARGET) -f $(@D)/Dockerfile .
docker tag $(DOCKER_NS)/fabric-$(TARGET) $(DOCKER_NS)/fabric-$(TARGET):$(DOCKER_TAG)
docker tag $(DOCKER_NS)/fabric-$(TARGET) $(DOCKER_NS)/fabric-$(TARGET):$(ARCH)-latest
@touch $@

$(BUILD_DIR)/image/%/$(DUMMY): Makefile $(BUILD_DIR)/image/%/payload $(BUILD_DIR)/image/%/Dockerfile
$(eval TARGET = ${patsubst $(BUILD_DIR)/image/%/$(DUMMY),%,${@}})
@echo "Building docker $(TARGET)-image"
$(DBUILD) -t $(DOCKER_NS)/fabric-$(TARGET) $(@D)
docker tag $(DOCKER_NS)/fabric-$(TARGET) $(DOCKER_NS)/fabric-$(TARGET):$(DOCKER_TAG)
docker tag $(DOCKER_NS)/fabric-$(TARGET) $(DOCKER_NS)/fabric-$(TARGET):$(ARCH)-latest
$(BUILD_DIR)/images/baseos/$(DUMMY):
@mkdir -p $(@D)
$(eval TARGET = ${patsubst $(BUILD_DIR)/images/%/$(DUMMY),%,${@}})
@echo "Docker: building $(TARGET) image"
$(DBUILD) -f images/peer/Dockerfile \
--target base \
--build-arg GO_VER=${GO_VER} --build-arg ALPINE_VER=${ALPINE_VER} \
-t $(BASE_DOCKER_NS)/fabric-$(TARGET) images/peer
docker tag $(BASE_DOCKER_NS)/fabric-$(TARGET) \
$(DOCKER_NS)/fabric-$(TARGET):$(BASE_VERSION)
docker tag $(BASE_DOCKER_NS)/fabric-$(TARGET) \
$(DOCKER_NS)/fabric-$(TARGET):$(DOCKER_TAG)
@touch $@

$(BUILD_DIR)/gotools.tar.bz2: $(BUILD_DIR)/docker/gotools
(cd $</bin && tar -jc *) > $@

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

$(BUILD_DIR)/sampleconfig.tar.bz2: $(shell find sampleconfig -type f)
(cd sampleconfig && tar -jc *) > $@
$(BUILD_DIR)/images/ccenv/$(DUMMY): BUILD_ARGS=--build-arg CHAINTOOL_RELEASE=${CHAINTOOL_RELEASE} \
--build-arg JAVA_VER=${JAVA_VER} --build-arg NODE_VER=${NODE_VER}

$(BUILD_DIR)/protos.tar.bz2: $(PROTOS)

$(BUILD_DIR)/%.tar.bz2:
@echo "Creating $@"
@tar -jc $^ > $@
$(BUILD_DIR)/images/%/$(DUMMY):
@mkdir -p $(@D)
$(eval TARGET = ${patsubst $(BUILD_DIR)/images/%/$(DUMMY),%,${@}})
@echo "Docker: building $(TARGET) image"
$(DBUILD) -f images/$(TARGET)/Dockerfile \
--build-arg GO_VER=${GO_VER} --build-arg ALPINE_VER=${ALPINE_VER} \
${BUILD_ARGS} \
-t $(BASE_DOCKER_NS)/fabric-$(TARGET) .
docker tag $(BASE_DOCKER_NS)/fabric-$(TARGET) \
$(DOCKER_NS)/fabric-$(TARGET):$(BASE_VERSION)
docker tag $(BASE_DOCKER_NS)/fabric-$(TARGET) \
$(DOCKER_NS)/fabric-$(TARGET):$(DOCKER_TAG)
@touch $@

# builds release packages for the host platform
release: $(patsubst %,release/%, $(MARCH))
Expand Down Expand Up @@ -421,7 +368,7 @@ docker-list: $(patsubst %,%-docker-list, $(IMAGES))
%-docker-clean:
$(eval TARGET = ${patsubst %-docker-clean,%,${@}})
-docker images --quiet --filter=reference='$(DOCKER_NS)/fabric-$(TARGET):$(ARCH)-$(BASE_VERSION)$(if $(EXTRA_VERSION),-snapshot-*,)' | xargs docker rmi -f
-@rm -rf $(BUILD_DIR)/image/$(TARGET) ||:
-@rm -rf $(BUILD_DIR)/images/$(TARGET) ||:

docker-clean: $(patsubst %,%-docker-clean, $(IMAGES))

Expand Down
1 change: 0 additions & 1 deletion common/metadata/metadata.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ package metadata
// Variables defined by the Makefile and passed in with ldflags
var Version string = "latest"
var CommitSHA string = "development build"
var BaseVersion string = "0.4.14"
var BaseDockerLabel string = "org.hyperledger.fabric"
var DockerNamespace string = "hyperledger"
var BaseDockerNamespace string = "hyperledger"
12 changes: 8 additions & 4 deletions core/chaincode/chaincodetest.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -299,23 +299,27 @@ chaincode:
name:

# Generic builder environment, suitable for most chaincode types
builder: $(DOCKER_NS)/fabric-ccenv:$(ARCH)-$(PROJECT_VERSION)
builder: $(DOCKER_NS)/fabric-ccenv:$(PROJECT_VERSION)

golang:
# golang will never need more than baseos
runtime: $(BASE_DOCKER_NS)/fabric-baseos:$(ARCH)-$(BASE_VERSION)
runtime: $(BASE_DOCKER_NS)/fabric-baseos:$(PROJECT_VERSION)

car:
# car may need more facilities (JVM, etc) in the future as the catalog
# of platforms are expanded. For now, we can just use baseos
runtime: $(BASE_DOCKER_NS)/fabric-baseos:$(ARCH)-$(BASE_VERSION)
runtime: $(BASE_DOCKER_NS)/fabric-baseos:$(PROJECT_VERSION)

java:
# This is an image based on java:openjdk-8 with addition compiler
# tools added for java shim layer packaging.
# This image is packed with shim layer libraries that are necessary
# for Java chaincode runtime.
runtime: $(DOCKER_NS)/fabric-javaenv:$(ARCH)-$(PROJECT_VERSION)
runtime: $(DOCKER_NS)/fabric-javaenv:latest

node:
# This is an image based on node:${NODE_VER}-alpine
runtime: $(DOCKER_NS)/fabric-nodeenv:latest

# timeout in millisecs for starting up a container and waiting for Register
# to come through. 1sec should be plenty for chaincode unit tests
Expand Down
4 changes: 2 additions & 2 deletions core/chaincode/platforms/node/platform_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -126,8 +126,8 @@ func TestGetDeploymentPayload(t *testing.T) {

func TestGenerateDockerfile(t *testing.T) {
str, _ := platform.GenerateDockerfile()
if !strings.Contains(str, "/fabric-baseimage:") {
t.Fatalf("should have generated a docker file using the fabric-baseimage, but got %s", str)
if !strings.Contains(str, "/fabric-nodeenv:") {
t.Fatalf("should have generated a docker file using the fabric-nodeenv, but got %s", str)
}

if !strings.Contains(str, "ADD binpackage.tar /usr/local/src") {
Expand Down
3 changes: 1 addition & 2 deletions core/chaincode/platforms/platforms.go
Original file line number Diff line number Diff line change
Expand Up @@ -126,8 +126,7 @@ func (r *Registry) GenerateDockerfile(ccType, name, version string) (string, err
buf = append(buf, fmt.Sprintf(`LABEL %s.chaincode.id.name="%s" \`, metadata.BaseDockerLabel, name))
buf = append(buf, fmt.Sprintf(` %s.chaincode.id.version="%s" \`, metadata.BaseDockerLabel, version))
buf = append(buf, fmt.Sprintf(` %s.chaincode.type="%s" \`, metadata.BaseDockerLabel, ccType))
buf = append(buf, fmt.Sprintf(` %s.version="%s" \`, metadata.BaseDockerLabel, metadata.Version))
buf = append(buf, fmt.Sprintf(` %s.base.version="%s"`, metadata.BaseDockerLabel, metadata.BaseVersion))
buf = append(buf, fmt.Sprintf(` %s.version="%s"`, metadata.BaseDockerLabel, metadata.Version))
// ----------------------------------------------------------------------------------------------------
// Then augment it with any general options
// ----------------------------------------------------------------------------------------------------
Expand Down
5 changes: 2 additions & 3 deletions core/chaincode/platforms/platforms_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -117,9 +117,8 @@ var _ = Describe("Platforms", func() {
LABEL org.hyperledger.fabric.chaincode.id.name="cc-name" \
org.hyperledger.fabric.chaincode.id.version="cc-version" \
org.hyperledger.fabric.chaincode.type="fakeType" \
org.hyperledger.fabric.version="%s" \
org.hyperledger.fabric.base.version="%s"
ENV CORE_CHAINCODE_BUILDLEVEL=%s`, metadata.Version, metadata.BaseVersion, metadata.Version)
org.hyperledger.fabric.version="%s"
ENV CORE_CHAINCODE_BUILDLEVEL=%s`, metadata.Version, metadata.Version)
Expect(df).To(Equal(expectedDockerfile))
})

Expand Down
1 change: 0 additions & 1 deletion core/container/util/dockerutil.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@ func ParseDockerfileTemplate(template string) string {
r := strings.NewReplacer(
"$(ARCH)", runtime.GOARCH,
"$(PROJECT_VERSION)", metadata.Version,
"$(BASE_VERSION)", metadata.BaseVersion,
"$(DOCKER_NS)", metadata.DockerNamespace,
"$(BASE_DOCKER_NS)", metadata.BaseDockerNamespace)

Expand Down
17 changes: 4 additions & 13 deletions docker-env.mk
Original file line number Diff line number Diff line change
@@ -1,16 +1,7 @@
# Copyright London Stock Exchange Group All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# SPDX-License-Identifier: Apache-2.0
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

ifneq ($(shell uname),Darwin)
DOCKER_RUN_FLAGS=--user=$(shell id -u)
Expand Down Expand Up @@ -48,10 +39,10 @@ DOCKER_RUN_FLAGS+=-e 'NO_PROXY=$(NO_PROXY)'
endif

DRUN = docker run -i --rm $(DOCKER_RUN_FLAGS) \
-v $(abspath .):/opt/gopath/src/$(PKGNAME) \
-w /opt/gopath/src/$(PKGNAME)
-v $(abspath .):/go/src/$(PKGNAME) \
-w /go/src/$(PKGNAME)

DBUILD = docker build $(DOCKER_BUILD_FLAGS)
DBUILD = docker build --force-rm $(DOCKER_BUILD_FLAGS)

BASE_DOCKER_NS ?= hyperledger
BASE_DOCKER_TAG=$(ARCH)-$(BASEIMAGE_RELEASE)
Expand Down
35 changes: 35 additions & 0 deletions images/buildenv/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#
ARG GO_VER
ARG ALPINE_VER
FROM golang:${GO_VER}-alpine${ALPINE_VER} as golang
RUN apk add --no-cache \
gcc \
musl-dev \
git \
bash \
curl \
make;
ADD . $GOPATH/src/github.com/hyperledger/fabric
WORKDIR $GOPATH/src/github.com/hyperledger/fabric
ENV EXECUTABLES go git curl
RUN make gotools

FROM golang:${GO_VER}-alpine

RUN apk add --no-cache \
gcc \
musl-dev \
git \
bash \
protobuf-dev \
libtool \
make;
COPY --from=golang /go/bin /usr/local/bin
ENV GOCACHE "/tmp"




10 changes: 0 additions & 10 deletions images/buildenv/Dockerfile.in

This file was deleted.

Loading

0 comments on commit fdd1c72

Please sign in to comment.