CCP2 Runtime Environment

Page content

Runtime Environment

Goals

  • Build optimized Dockerfiles, so-called multi-stage Dockerfiles.
  • Recap the concepts of buildpacks
  • Discover the functionality of buildpacks
  • Investigate the internals and structure of buildpacks.

Multi stage Dockerfiles

Builder pattern
two seperate Dockerfiles were used. one that contained everything needed to build the application. one for production that contained everything to run the app.

Multi Stage Dockerfile
can be solved with this by having a build and a run stage
Multi Stage Docker File Guide

Buildpacks

Buildpacks provide framework and runtime support for applications. Buildpacks examine your apps to determine all the dependencies it needs and configure them appropriately to run on any cloud.

Detect Phase
analyzes sourcecode to decide if the buildpack is applicaple.

Build Phase

  • Runs agains source code to setup build-time and runtime environment
  • download dependencies and compile source code
  • set appropriate entry point and startup script

The build image provides the base environment for the builder (for eg. an Ubuntu Bionic OS image with build tooling) and a run image provides the base environment for the app image during runtime. A combination of a build image and a run image is called a stack.

Lifecycle

  • detect
  • restore
  • analyze
  • build
  • export
  • cache
  • launch

LAB

Task2

Commands

docker run --rm -it --entrypoint bash ccp2-order:build
docker build --tag=ccp2-order:build --target build .

Files

Dockerfile

FROM gradle:jdk11-focal as build
COPY --chown=gradle:gradle ./ /home/gradle/app
WORKDIR /home/gradle/app
RUN ./gradlew assemble --no-daemon && rm ./build/libs/*-plain.jar

FROM openjdk:11.0.10-jre-slim
COPY --from=build /home/gradle/app/build/libs/*.jar /app/spring-boot-application.jar
CMD java -Xmx300m -Xms300m -XX:TieredStopAtLevel=1 -noverify -jar /app/spring-boot-application.jar
EXPOSE 8080

Task3

Commands

pack build ccp2-order:1 --path ./microservice-order --builder paketobuildpacks/builder:tiny

Files

Task4

Commands

make build-stacks
make build-builders
make build-apps

Files

Makefile

PACK_FLAGS?=--pull-policy=if-not-present
PACK_BUILD_FLAGS?=--trust-builder
PACK_CMD?=pack

build: build-stacks build-builders build-apps

build-stacks: build-stack-alpine build-stack-bionic

build-alpine: build-stack-alpine build-builder-alpine build-apps-alpine

build-bionic: build-stack-bionic build-builder-bionic build-apps-bionic

build-stack-alpine:
        @echo "> Building 'alpine' stack..."
        bash stacks/build-stack.sh stacks/alpine

build-stack-bionic:
        @echo "> Building 'bionic' stack..."
        bash stacks/build-stack.sh stacks/bionic

build-builders: build-builder-alpine build-builder-bionic

build-builder-alpine: build-root
        @echo "> Building 'alpine' builder..."
        $(PACK_CMD) builder create ccp2/builder:alpine --config $(SAMPLES_ROOT)/builders/alpine/builder.toml $(PACK_FLAGS)

build-builder-bionic: build-root
        @echo "> Building 'bionic' builder..."
        $(PACK_CMD) builder create ccp2/builder:bionic --config $(SAMPLES_ROOT)/builders/bionic/builder.toml $(PACK_FLAGS)

build-apps: build-apps-alpine build-apps-bionic

build-apps-alpine: build-root
        @echo "> Creating '-maven' app using 'alpine' builder..."
        $(PACK_CMD) build sample-maven:alpine -v --builder ccp2/builder:alpine --path apps/sample-maven $(PACK_FLAGS) $(PACK_B
UILD_FLAGS)

        @echo "> Creating 'sample-gradle' app using 'alpine' builder..."
        $(PACK_CMD) build sample-gradle:alpine -v --builder ccp2/builder:alpine --path apps/sample-gradle $(PACK_FLAGS) $(PACK
_BUILD_FLAGS)

build-apps-bionic: build-root
        @echo "> Creating 'sample-maven' app using 'bionic' builder..."
        $(PACK_CMD) build sample-maven:bionic -v --builder ccp2/builder:bionic --path apps/sample-maven $(PACK_FLAGS) $(PACK_B
UILD_FLAGS)

        @echo "> Creating 'sample-gradle' app using 'bionic' builder..."
        $(PACK_CMD) build sample-gradle:bionic -v --builder ccp2/builder:bionic --path apps/sample-gradle $(PACK_FLAGS) $(PACK
_BUILD_FLAGS)

deploy: deploy-stacks deploy-builders

deploy-stacks:
        @echo "> Deploying 'alpine' stack..."
        docker push ccp2/stack-base:alpine
        docker push ccp2/stack-run:alpine
        docker push ccp2/stack-build:alpine

        @echo "> Deploying 'bionic' stack..."
        docker push ccp2/stack-base:bionic
        docker push ccp2/stack-run:bionic
        docker push ccp2/stack-build:bionic

deploy-builders:
        @echo "> Deploying 'alpine' builder..."
        docker push ccp2/builder:alpine

        @echo "> Deploying 'bionic' builder..."
        docker push ccp2/builder:bionic



clean:
        @echo "> Removing 'alpine' stack..."
        docker rmi ccp2/stack-base:alpine || true
        docker rmi ccp2/stack-run:alpine || true
        docker rmi ccp2/stack-build:alpine || true

        @echo "> Removing 'bionic' stack..."
        docker rmi ccp2/stack-base:bionic || true
        docker rmi ccp2/stack-run:bionic || true
        docker rmi ccp2/stack-build:bionic || true

        @echo "> Removing builders..."
        docker rmi ccp2/builder:alpine || true
        docker rmi ccp2/builder:bionic || true

        @echo "> Removing 'alpine' apps..."
        docker rmi sample-maven-app:alpine || true
        docker rmi sample-gradle-app:alpine || true

        @echo "> Removing 'bionic' apps..."
        docker rmi sample-maven:bionic || true
        docker rmi sample-gradle:bionic || true

        @echo "> Removing '.tmp'"
        rm -rf .tmp

set-experimental:
        @echo "> Setting experimental"
        $(PACK_CMD) config experimental true

# No-op for posix pack
SAMPLES_ROOT:=.
build-root: