Layer Cache
Ensure layer is cached and only re-built if package.json changes.
FROM node:18 AS build
WORKDIR /app
COPY package* yarn.lock ./
RUN yarn install
COPY public ./public
COPY src ./src
RUN yarn run build
FROM nginx:alpine
COPY --from=build /app/build /usr/share/nginx/html
.dockerignore
node_modules
Multi-stage builds. https://www.docker.com/blog/advanced-dockerfiles-faster-builds-and-smaller-images-using-buildkit-and-multistage-builds/
Multistage builds added a couple of new syntax concepts. First of all, you can name a stage that starts with a FROM
command with AS stagename
and use --from=stagename
option in a COPY
command to copy files from that stage. In fact, FROM
command and --from
flag have much more in common and it is not accidental that they are named the same. They both take the same argument, resolve it and then either start a new stage from that point or use it as a source for file copy.
That means that same way as you can use --from=stagename
you can also use FROM stagename
to use a previous stage as a source image for your current stage. This is useful when multiple commands in the Dockerfile share the same common parts. It makes the shared code smaller and easier to maintain while keeping the child stages separate so that when one is rebuilt it doesn’t invalidate the build cache for the others. Each stage can also be built individually using the --target
flag while invoking docker build
.
FROM ubuntu AS base
RUN apt-get update && apt-get install git
FROM base AS src1
RUN git clone …
FROM base AS src2
RUN git clone …