diff --git a/Makefile b/Makefile index 6c6e0923c..343682433 100755 --- a/Makefile +++ b/Makefile @@ -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, @@ -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 ?= @@ -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 @@ -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) @@ -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 @@ -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 @@ -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 $ $@ - -$(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)) @@ -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)) diff --git a/common/metadata/metadata.go b/common/metadata/metadata.go index 9ab19797b..275a5206b 100644 --- a/common/metadata/metadata.go +++ b/common/metadata/metadata.go @@ -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" diff --git a/core/chaincode/chaincodetest.yaml b/core/chaincode/chaincodetest.yaml index b9be29375..40470dc50 100644 --- a/core/chaincode/chaincodetest.yaml +++ b/core/chaincode/chaincodetest.yaml @@ -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 diff --git a/core/chaincode/platforms/node/platform_test.go b/core/chaincode/platforms/node/platform_test.go index b463c2058..fca0635bf 100644 --- a/core/chaincode/platforms/node/platform_test.go +++ b/core/chaincode/platforms/node/platform_test.go @@ -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") { diff --git a/core/chaincode/platforms/platforms.go b/core/chaincode/platforms/platforms.go index fa7a0a7d1..290fd714f 100644 --- a/core/chaincode/platforms/platforms.go +++ b/core/chaincode/platforms/platforms.go @@ -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 // ---------------------------------------------------------------------------------------------------- diff --git a/core/chaincode/platforms/platforms_test.go b/core/chaincode/platforms/platforms_test.go index f6c662ddf..76e9abb06 100644 --- a/core/chaincode/platforms/platforms_test.go +++ b/core/chaincode/platforms/platforms_test.go @@ -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)) }) diff --git a/core/container/util/dockerutil.go b/core/container/util/dockerutil.go index 5528574e4..1b15d3512 100644 --- a/core/container/util/dockerutil.go +++ b/core/container/util/dockerutil.go @@ -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) diff --git a/docker-env.mk b/docker-env.mk index 1c5236fb7..ff2316fd2 100644 --- a/docker-env.mk +++ b/docker-env.mk @@ -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) @@ -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) diff --git a/images/buildenv/Dockerfile b/images/buildenv/Dockerfile new file mode 100644 index 000000000..378b69d37 --- /dev/null +++ b/images/buildenv/Dockerfile @@ -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" + + + + diff --git a/images/buildenv/Dockerfile.in b/images/buildenv/Dockerfile.in deleted file mode 100644 index 0780b8497..000000000 --- a/images/buildenv/Dockerfile.in +++ /dev/null @@ -1,10 +0,0 @@ -# Copyright Greg Haskins All Rights Reserved -# -# SPDX-License-Identifier: Apache-2.0 - -FROM _BASE_NS_/fabric-baseimage:_BASE_TAG_ -COPY payload/protoc-gen-go /usr/local/bin/ -ADD payload/gotools.tar.bz2 /usr/local/bin/ - -# override GOCACHE=off from fabric-baseimage -ENV GOCACHE "/tmp" diff --git a/images/ccenv/Dockerfile b/images/ccenv/Dockerfile new file mode 100644 index 000000000..0eef8e676 --- /dev/null +++ b/images/ccenv/Dockerfile @@ -0,0 +1,58 @@ +# Copyright IBM Corp. All Rights Reserved. +# +# SPDX-License-Identifier: Apache-2.0 +# +ARG GO_VER +ARG ALPINE_VER +ARG JAVA_VER +ARG NODE_VER +FROM golang:${GO_VER}-alpine${ALPINE_VER} as golang +ARG CHAINTOOL_RELEASE +ARG CHAINTOOL_URL=https://nexus.hyperledger.org/content/repositories/releases/org/hyperledger/fabric/hyperledger-fabric/chaintool-${CHAINTOOL_RELEASE}/hyperledger-fabric-chaintool-${CHAINTOOL_RELEASE}.jar +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 gotool.protoc-gen-go \ + && go get -u github.com/kardianos/govendor \ + && mkdir $GOPATH/src/input \ + && cp images/ccenv/main.go $GOPATH/src/input/. \ + && cd $GOPATH/src/input \ + && $GOPATH/bin/govendor init \ + && $GOPATH/bin/govendor add +external github.com/hyperledger/fabric/core/chaincode/shim \ + && rm $GOPATH/src/input/vendor/vendor.json \ + && curl -fL ${CHAINTOOL_URL} > /usr/local/bin/chaintool \ + && chmod +x /usr/local/bin/chaintool + +FROM node:${NODE_VER}-alpine as node + +FROM openjdk:${JAVA_VER}-jdk-alpine${ALPINE_VER} +RUN apk add --no-cache \ + make \ + g++ \ + python \ + gcc \ + musl-dev \ + libtool \ + protobuf \ + git; +ENV PATH=/usr/local/go/bin:${PATH} +ENV GOPATH=/go +RUN mkdir -p /chaincode/output \ + && mkdir -p /chaincode/input \ + && mkdir -p /go/src \ + && mkdir -p /go/bin \ + && mkdir -p /go/pkg +COPY --from=node /usr/local/bin /usr/local/bin +COPY --from=node /usr/local/lib/node_modules /usr/local/lib/node_modules +COPY --from=node /usr/local/include/node /usr/local/include/node +COPY --from=golang /usr/local/go /usr/local/go +COPY --from=golang /usr/local/bin/chaintool /usr/local/bin/chaintool +COPY --from=golang /go/bin /usr/local/bin +COPY --from=golang /go/src/input/vendor $GOPATH/src diff --git a/images/ccenv/Dockerfile.in b/images/ccenv/Dockerfile.in deleted file mode 100644 index 6d032872d..000000000 --- a/images/ccenv/Dockerfile.in +++ /dev/null @@ -1,8 +0,0 @@ -# Copyright Greg Haskins All Rights Reserved -# -# SPDX-License-Identifier: Apache-2.0 -# -FROM _BASE_NS_/fabric-baseimage:_BASE_TAG_ -COPY payload/chaintool payload/protoc-gen-go /usr/local/bin/ -ADD payload/goshim.tar.bz2 $GOPATH/src/ -RUN mkdir -p /chaincode/input /chaincode/output diff --git a/images/ccenv/main.go b/images/ccenv/main.go new file mode 100644 index 000000000..8b1bb9a5a --- /dev/null +++ b/images/ccenv/main.go @@ -0,0 +1,15 @@ +/* +Copyright IBM Corp. All Rights Reserved. + +SPDX-License-Identifier: Apache-2.0 +*/ +package main + +// This enables govendor to pull in external dependencies in the Docker build +import ( + _ "github.com/hyperledger/fabric/core/chaincode/shim" +) + +func main() { + return +} diff --git a/images/orderer/Dockerfile b/images/orderer/Dockerfile new file mode 100644 index 000000000..f1a70329c --- /dev/null +++ b/images/orderer/Dockerfile @@ -0,0 +1,33 @@ +# Copyright IBM Corp. All Rights Reserved. +# +# SPDX-License-Identifier: Apache-2.0 +# +ARG GO_VER +ARG ALPINE_VER +FROM alpine:${ALPINE_VER} as base +RUN apk add --no-cache tzdata libltdl + +FROM golang:${GO_VER}-alpine${ALPINE_VER} as golang +RUN apk add --no-cache \ + gcc \ + musl-dev \ + git \ + bash \ + make; +ADD . $GOPATH/src/github.com/hyperledger/fabric +WORKDIR $GOPATH/src/github.com/hyperledger/fabric +ENV EXECUTABLES go git + +FROM golang as orderer +RUN make orderer + +FROM base +ENV FABRIC_CFG_PATH /etc/hyperledger/fabric +VOLUME /etc/hyperledger/fabric +VOLUME /var/hyperledger +COPY --from=orderer /go/src/github.com/hyperledger/fabric/.build/bin /usr/local/bin +COPY --from=orderer /go/src/github.com/hyperledger/fabric/sampleconfig/msp ${FABRIC_CFG_PATH}/msp +COPY --from=orderer /go/src/github.com/hyperledger/fabric/sampleconfig/orderer.yaml ${FABRIC_CFG_PATH} +COPY --from=orderer /go/src/github.com/hyperledger/fabric/sampleconfig/configtx.yaml ${FABRIC_CFG_PATH} +EXPOSE 7050 +CMD ["orderer"] diff --git a/images/orderer/Dockerfile.in b/images/orderer/Dockerfile.in deleted file mode 100644 index 3b8a2f7ac..000000000 --- a/images/orderer/Dockerfile.in +++ /dev/null @@ -1,11 +0,0 @@ -# Copyright Greg Haskins All Rights Reserved -# -# SPDX-License-Identifier: Apache-2.0 -# -FROM _BASE_NS_/fabric-baseos:_BASE_TAG_ -ENV FABRIC_CFG_PATH /etc/hyperledger/fabric -RUN mkdir -p /var/hyperledger/production $FABRIC_CFG_PATH -COPY payload/orderer /usr/local/bin -ADD payload/sampleconfig.tar.bz2 $FABRIC_CFG_PATH/ -EXPOSE 7050 -CMD ["orderer"] diff --git a/images/peer/Dockerfile b/images/peer/Dockerfile new file mode 100644 index 000000000..6d97e3d70 --- /dev/null +++ b/images/peer/Dockerfile @@ -0,0 +1,32 @@ +# Copyright IBM Corp. All Rights Reserved. +# +# SPDX-License-Identifier: Apache-2.0 +# +ARG GO_VER=1.11.1 +ARG ALPINE_VER=3.8 +FROM alpine:${ALPINE_VER} as base +RUN apk add --no-cache tzdata libltdl + +FROM golang:${GO_VER}-alpine${ALPINE_VER} as golang +RUN apk add --no-cache \ + gcc \ + musl-dev \ + git \ + bash \ + make; +ADD . $GOPATH/src/github.com/hyperledger/fabric +WORKDIR $GOPATH/src/github.com/hyperledger/fabric +ENV EXECUTABLES go git + +FROM golang as peer +RUN make peer + +FROM base +ENV FABRIC_CFG_PATH /etc/hyperledger/fabric +VOLUME /etc/hyperledger/fabric +VOLUME /var/hyperledger +COPY --from=peer /go/src/github.com/hyperledger/fabric/.build/bin /usr/local/bin +COPY --from=peer /go/src/github.com/hyperledger/fabric/sampleconfig/msp ${FABRIC_CFG_PATH}/msp +COPY --from=peer /go/src/github.com/hyperledger/fabric/sampleconfig/core.yaml ${FABRIC_CFG_PATH} +EXPOSE 7051 +CMD ["peer","node","start"] diff --git a/images/peer/Dockerfile.in b/images/peer/Dockerfile.in deleted file mode 100644 index f61c2e58b..000000000 --- a/images/peer/Dockerfile.in +++ /dev/null @@ -1,10 +0,0 @@ -# Copyright Greg Haskins All Rights Reserved -# -# SPDX-License-Identifier: Apache-2.0 -# -FROM _BASE_NS_/fabric-baseos:_BASE_TAG_ -ENV FABRIC_CFG_PATH /etc/hyperledger/fabric -RUN mkdir -p /var/hyperledger/production $FABRIC_CFG_PATH -COPY payload/peer /usr/local/bin -ADD payload/sampleconfig.tar.bz2 $FABRIC_CFG_PATH -CMD ["peer","node","start"] diff --git a/images/tools/Dockerfile b/images/tools/Dockerfile new file mode 100644 index 000000000..21d2d0abe --- /dev/null +++ b/images/tools/Dockerfile @@ -0,0 +1,31 @@ +# Copyright IBM Corp. All Rights Reserved. +# +# SPDX-License-Identifier: Apache-2.0 +# +ARG GO_VER +ARG ALPINE_VER +FROM golang:${GO_VER}-alpine as golang + +RUN apk add --no-cache \ + gcc \ + musl-dev \ + git \ + bash \ + make; + +ADD . $GOPATH/src/github.com/hyperledger/fabric +WORKDIR $GOPATH/src/github.com/hyperledger/fabric +ENV EXECUTABLES go git + +FROM golang as tools +RUN make configtxgen configtxlator cryptogen peer discover idemixgen + +FROM golang:${GO_VER}-alpine +RUN apk add --no-cache \ + tzdata \ + jq \ + bash; +ENV FABRIC_CFG_PATH /etc/hyperledger/fabric +VOLUME /etc/hyperledger/fabric +COPY --from=tools /go/src/github.com/hyperledger/fabric/.build/bin /usr/local/bin +COPY --from=tools /go/src/github.com/hyperledger/fabric/sampleconfig ${FABRIC_CFG_PATH} diff --git a/images/tools/Dockerfile.in b/images/tools/Dockerfile.in deleted file mode 100644 index 52b155ed2..000000000 --- a/images/tools/Dockerfile.in +++ /dev/null @@ -1,18 +0,0 @@ -# Copyright Greg Haskins All Rights Reserved -# -# SPDX-License-Identifier: Apache-2.0 -# -FROM _BASE_NS_/fabric-baseimage:_BASE_TAG_ as builder -WORKDIR /opt/gopath -RUN mkdir src && mkdir pkg && mkdir bin -ADD . src/github.com/hyperledger/fabric -WORKDIR /opt/gopath/src/github.com/hyperledger/fabric -ENV EXECUTABLES go git curl -RUN make configtxgen configtxlator cryptogen peer discover idemixgen - -FROM _BASE_NS_/fabric-baseimage:_BASE_TAG_ -ENV FABRIC_CFG_PATH /etc/hyperledger/fabric -RUN apt-get update && apt-get install -y jq -VOLUME /etc/hyperledger/fabric -COPY --from=builder /opt/gopath/src/github.com/hyperledger/fabric/.build/bin /usr/local/bin -COPY --from=builder /opt/gopath/src/github.com/hyperledger/fabric/sampleconfig $FABRIC_CFG_PATH diff --git a/integration/nwo/components.go b/integration/nwo/components.go index 10db9e505..b71237cac 100644 --- a/integration/nwo/components.go +++ b/integration/nwo/components.go @@ -7,9 +7,7 @@ SPDX-License-Identifier: Apache-2.0 package nwo import ( - "fmt" "os" - "runtime" "github.com/hyperledger/fabric/integration/helpers" "github.com/hyperledger/fabric/integration/runner" @@ -17,12 +15,14 @@ import ( "github.com/onsi/gomega/gexec" ) +const CCEnvDefaultImage = "hyperledger/fabric-ccenv:latest" + type Components struct { Paths map[string]string } var RequiredImages = []string{ - fmt.Sprintf("hyperledger/fabric-ccenv:%s-latest", runtime.GOARCH), + CCEnvDefaultImage, runner.CouchDBDefaultImage, runner.KafkaDefaultImage, runner.ZooKeeperDefaultImage, diff --git a/integration/nwo/core_template.go b/integration/nwo/core_template.go index d59e22b30..15fc61069 100644 --- a/integration/nwo/core_template.go +++ b/integration/nwo/core_template.go @@ -145,17 +145,17 @@ vm: Memory: 2147483648 chaincode: - builder: $(DOCKER_NS)/fabric-ccenv:$(ARCH)-$(PROJECT_VERSION) + builder: $(DOCKER_NS)/fabric-ccenv:$(PROJECT_VERSION) pull: false golang: - runtime: $(BASE_DOCKER_NS)/fabric-baseos:$(ARCH)-$(BASE_VERSION) + runtime: $(BASE_DOCKER_NS)/fabric-baseos:$(PROJECT_VERSION) dynamicLink: false car: - runtime: $(BASE_DOCKER_NS)/fabric-baseos:$(ARCH)-$(BASE_VERSION) + runtime: $(BASE_DOCKER_NS)/fabric-baseos:$(PROJECT_VERSION) java: - runtime: $(DOCKER_NS)/fabric-javaenv:$(ARCH)-$(PROJECT_VERSION) + runtime: $(DOCKER_NS)/fabric-javaenv:latest node: - runtime: $(BASE_DOCKER_NS)/fabric-baseimage:$(ARCH)-$(BASE_VERSION) + runtime: $(DOCKER_NS)/fabric-nodeenv:latest startuptimeout: 300s executetimeout: 30s mode: net diff --git a/integration/sbe/sbe_suite_test.go b/integration/sbe/sbe_suite_test.go index 325903a7d..35e3b6195 100644 --- a/integration/sbe/sbe_suite_test.go +++ b/integration/sbe/sbe_suite_test.go @@ -8,8 +8,6 @@ package e2e import ( "encoding/json" - "fmt" - "runtime" "testing" "github.com/hyperledger/fabric/integration/nwo" @@ -26,7 +24,7 @@ var components *nwo.Components var _ = SynchronizedBeforeSuite(func() []byte { nwo.RequiredImages = []string{ - fmt.Sprintf("hyperledger/fabric-ccenv:%s-latest", runtime.GOARCH), + nwo.CCEnvDefaultImage, } components = &nwo.Components{} components.Build() diff --git a/peer/version/version.go b/peer/version/version.go index 56c9a94df..92fd07452 100644 --- a/peer/version/version.go +++ b/peer/version/version.go @@ -39,20 +39,16 @@ var cobraCommand = &cobra.Command{ // GetInfo returns version information for the peer func GetInfo() string { - if metadata.Version == "" { - metadata.Version = "development build" - } - - ccinfo := fmt.Sprintf(" Base Image Version: %s\n"+ - " Base Docker Namespace: %s\n"+ + ccinfo := fmt.Sprintf(" Base Docker Namespace: %s\n"+ " Base Docker Label: %s\n"+ " Docker Namespace: %s\n", - metadata.BaseVersion, metadata.BaseDockerNamespace, - metadata.BaseDockerLabel, metadata.DockerNamespace) + metadata.BaseDockerNamespace, + metadata.BaseDockerLabel, + metadata.DockerNamespace) return fmt.Sprintf("%s:\n Version: %s\n Commit SHA: %s\n Go version: %s\n"+ " OS/Arch: %s\n"+ - " Chaincode:\n %s\n", + " Chaincode:\n%s\n", ProgramName, metadata.Version, metadata.CommitSHA, runtime.Version(), fmt.Sprintf("%s/%s", runtime.GOOS, runtime.GOARCH), ccinfo) } diff --git a/sampleconfig/core.yaml b/sampleconfig/core.yaml index f3e9139d7..db997d161 100644 --- a/sampleconfig/core.yaml +++ b/sampleconfig/core.yaml @@ -457,7 +457,7 @@ chaincode: name: # Generic builder environment, suitable for most chaincode types - builder: $(DOCKER_NS)/fabric-ccenv:latest + builder: $(DOCKER_NS)/fabric-ccenv:$(PROJECT_VERSION) # Enables/disables force pulling of the base docker images (listed below) # during user chaincode instantiation. @@ -466,7 +466,7 @@ chaincode: 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) # whether or not golang chaincode should be linked dynamically dynamicLink: false @@ -474,19 +474,18 @@ chaincode: 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: - # need node.js engine at runtime, currently available in baseimage - # but not in baseos - runtime: $(BASE_DOCKER_NS)/fabric-baseimage:$(ARCH)-$(BASE_VERSION) + # This is an image based on node:$(NODE_VER)-alpine + runtime: $(DOCKER_NS)/fabric-nodeenv:latest # Timeout duration for starting up a container and waiting for Register # to come through. 1sec should be plenty for chaincode unit tests