FROM base-image
RUN apt-get update
RUN apt-get install mypkg
Slide 42
Slide 42 text
FROM base-image
RUN apt-get update
RUN apt-get install mypkg
RUN apt-get clean
Slide 43
Slide 43 text
FROM base-image
RUN apt-get update \
&& apt-get install mypkg \
&& apt-get clean
Tip #2: Combine install commands with cleanup
Slide 44
Slide 44 text
RUN apt-get install build-essential \
&& bundle install
Slide 45
Slide 45 text
http://artgallery.msfc.nasa.gov/4459.html
Source: NASA
Slide 46
Slide 46 text
FROM my-base AS builder
COPY . /app
RUN apt-get install build-essential \
&& bundle install --deployment
FROM my-base
COPY --from=builder /app /app
Slide 47
Slide 47 text
FROM my-base AS builder
COPY . /app
RUN apt-get install build-essential \
&& bundle install --deployment
FROM my-base
COPY --from=builder /app /app
Slide 48
Slide 48 text
FROM my-base AS builder
COPY . /app
RUN apt-get install build-essential \
&& bundle install --deployment
FROM my-base
COPY --from=builder /app /app
Ruby base image
Slide 49
Slide 49 text
FROM my-base AS builder
COPY . /app
RUN apt-get install build-essential \
&& bundle install --deployment
FROM my-base
COPY --from=builder /app /app
Ruby base image
App source
Slide 50
Slide 50 text
FROM my-base AS builder
COPY . /app
RUN apt-get install build-essential \
&& bundle install --deployment
FROM my-base
COPY --from=builder /app /app
Ruby base image
App source
Compilers, etc.
Slide 51
Slide 51 text
FROM my-base AS builder
COPY . /app
RUN apt-get install build-essential \
&& bundle install --deployment
FROM my-base
COPY --from=builder /app /app
Ruby base image
App source
Vendored gems
Compilers, etc.
Slide 52
Slide 52 text
FROM my-base AS builder
COPY . /app
RUN apt-get install build-essential \
&& bundle install --deployment
FROM my-base
COPY --from=builder /app /app
Ruby base image Ruby base image
App source
Vendored gems
Compilers, etc.
Slide 53
Slide 53 text
FROM my-base AS builder
COPY . /app
RUN apt-get install build-essential \
&& bundle install --deployment
FROM my-base
COPY --from=builder /app /app
Ruby base image Ruby base image
App source
Vendored gems
Compilers, etc.
App w/vendored gems
Slide 54
Slide 54 text
FROM my-base AS builder
COPY . /app
RUN apt-get install build-essential \
&& bundle install --deployment
FROM my-base
COPY --from=builder /app /app
Ruby base image
Ruby base image
App source
Vendored gems
Compilers, etc.
App w/vendored gems
Slide 55
Slide 55 text
FROM my-base AS builder
COPY . /app
RUN apt-get install build-essential \
&& bundle install --deployment
FROM my-base
COPY --from=builder /app /app
Ruby base image
App w/vendored gems
Tip #3: Use a separate build stage
Slide 56
Slide 56 text
Gerd Rohs, "Image in the image"
https://pixabay.com/en/image-in-the-image-mobile-phone-2204798/
CC0
Slide 57
Slide 57 text
No content
Slide 58
Slide 58 text
RUN echo "en_US.UTF-8 UTF-8" > /etc/locale.gen \
&& locale-gen en_US.UTF-8
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
Tip #4: Set the system locale
Slide 59
Slide 59 text
"Australia in a Nutshell" (Sign contents modified)
Photo by: Kristian Thøgersen
Source: https://www.flickr.com/photos/flottenheimer/5534636006
License: https://creativecommons.org/licenses/by/2.0/
Slide 60
Slide 60 text
Tip #5: Create an unprivileged user
# After building your app...
RUN adduser -s /bin/sh -u 1001 -G root \
-h /app -S -D rails \
&& chown -R rails /app
USER rails
Slide 61
Slide 61 text
# Exec form
CMD ["bundle", "exec", "rails", "s"]
# Shell form
CMD bundle exec rails s
Slide 62
Slide 62 text
# Exec form
CMD ["bundle", "exec", "rails", "s"]
# Shell form
CMD bundle exec rails s
Tip #6: Prefer exec form for CMD
Slide 63
Slide 63 text
# Exec form
CMD ["bundle", "exec", "rails", "s"]
# Shell form
CMD exec bundle exec rails s
Tip #7: Prefix shell form with the “exec” keyword
Slide 64
Slide 64 text
ONBUILD
Slide 65
Slide 65 text
# Base image...
ONBUILD COPY . /app
ONBUILD RUN bundle install
# ...
Slide 66
Slide 66 text
# Base image...
ONBUILD COPY . /app
ONBUILD RUN bundle install
# ...
# App image...
FROM base-image
# (implicit commands)
Slide 67
Slide 67 text
# Base image...
ONBUILD COPY . /app
ONBUILD RUN bundle install
# ...
# App image...
FROM base-image
# (implicit commands)
Tip #8: Avoid ONBUILD
Slide 68
Slide 68 text
Containers in
production
Slide 69
Slide 69 text
Containers == isolation
Slide 70
Slide 70 text
Containers == isolation
⟹ predictability
Slide 71
Slide 71 text
docker run --cpus=2.0 --memory=200M ...
Tip #9: Always specify resource constraints