CCP2 Runtime Environment
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: