# Exercise 12a — Build a Containerfile step by step # # Start with an empty Containerfile and add one instruction at a time. # After each step: podman build -t myapp:latest . # Then inspect the result before moving on. cd listings/exercises/ex12a-containerfile-steps/ # ----------------------------------------------------------------------- # Step 1 — Base image # ----------------------------------------------------------------------- # Containerfile: # FROM debian:12 podman build -t myapp:latest . podman images myapp:latest # ~121 MB # ----------------------------------------------------------------------- # Step 2 — Install software (creates a new layer) # ----------------------------------------------------------------------- # Add to Containerfile: # RUN apt-get update && apt-get install -y curl podman build -t myapp:latest . podman images myapp:latest # ~159 MB — layer is visible # ----------------------------------------------------------------------- # Step 3 — Working directory # ----------------------------------------------------------------------- # Add to Containerfile: # WORKDIR /app podman build -t myapp:latest . podman run --rm myapp:latest pwd # prints /app # ----------------------------------------------------------------------- # Step 4 — Copy your script into the image # ----------------------------------------------------------------------- # Add to Containerfile: # COPY hello.sh . # RUN chmod +x hello.sh podman build -t myapp:latest . podman run --rm myapp:latest ls -la # hello.sh is there # ----------------------------------------------------------------------- # Step 5 — Environment variable # ----------------------------------------------------------------------- # Add to Containerfile: # ENV NAME=Trainee podman build -t myapp:latest . podman run --rm myapp:latest env | grep NAME # ----------------------------------------------------------------------- # Step 6 — Start command # ----------------------------------------------------------------------- # Add to Containerfile: # CMD ["./hello.sh"] podman build -t myapp:latest . podman run --rm myapp:latest # uses ENV NAME=Trainee podman run --rm -e NAME=Frank myapp:latest # override at runtime # ----------------------------------------------------------------------- # Bonus: layers — chained vs. separate RUN # ----------------------------------------------------------------------- # Two separate RUN = two layers: # RUN apt-get update # RUN apt-get install -y curl # # One chained RUN = one layer: # RUN apt-get update && apt-get install -y curl podman inspect myapp:latest --format '{{len .RootFS.Layers}} layers'