# EOD code 1/21/21 Here are the Dockerfiles that were coded out during EOD for each of the three phases of the Dockerfile Deep Dive project. ## Phase 1 ```dockerfile= # Project: Extend an existing official image from # Docker Hub to run a webserver # Step 1: Use the 'nginx' official image, with the # latest version for alpine # Pinning a version makes development so much # easier because it is predictable FROM nginx:1.18-alpine # Step 2: Change our working directory # to the root of nginx webhost # Using 'WORKDIR /some/path' is preferred to # using 'RUN cd /some/path' WORKDIR /usr/share/nginx/html # Step 3: Copy in the file or files or folder! COPY index.html . # No need to specify EXPOSE or CMD because # they're include in the base (FROM) ``` ## Phase 2 ```dockerfile= # Project: Run an express app in a Docker container # Step 1: Use the 'node' official image # (a recent version with an alpine base) FROM node:15-alpine # Step 2: Look in the app.js to determine which port # to expose EXPOSE 8081 # Step 3A: Use alpine package manager to install tini: # 'apk add --update tini' # (tini is a package that can be used as an entry # point in a container) # Step 3B: Create a new directory for app files using # 'mkdir -p /usr/src/app' # Chain the commmands together to reduce the # number of layers in the image # note: we skipped step 3B since the WORKDIR command # in step 4 can create the directory for us. RUN apk add --update tini # Step 4: Change your current directory to the one # you created in the previous step WORKDIR /usr/src/app # Load and install packages before application # files for better caching # Step 5: Since node uses a "package manager", # copy in 'package.json' and the # corresponding lock file COPY package*.json ./ # Step 6: Install dependencies using npm # To keep the image clean and small, # run 'npm cache clean --force' after RUN npm install && npm cache clean --force # Step 7: Copy in all files from current directory COPY . . # Step 8. Run the application with command # '/sbin/tini -- node app.js'. # Here is the documentation for CMD if you need # a reminder: # https://docs.docker.com/engine/reference/builder/#cmd CMD ["/sbin/tini", "--", "node", "app.js"] ``` ## Phase 3 ```dockerfile= # Project: Build a React app and serve it with nginx # Step 1: Base image for build stage - use official # node image with alpine base # Name it build-stage FROM node:15-alpine as build-stage # Step 2: Set the working directory to /app WORKDIR /app # Step 3: Copy in all the files needed to install dependencies COPY package*.json ./ # Step 4: Install dependencies using npm # To keep the image small, (force) clean the npm cache after # Chain the commands to reduce the number of layers in the image RUN npm install && npm cache clean --force # Step 5: Copy in all the files from the current directory COPY . . # Step 6: Build application RUN npm run build # Step 7: Bring in the base image for NGINX (alpine) FROM nginx:1.18-alpine # (There will be no need to EXPOSE a port because # this base image already has an EXPOSE command) # Step 8: Set working directory to the html folder # for nginx # (Hint: This directory was also used in phase 1) WORKDIR /usr/share/nginx/html # Step 9: Copy over the build files from build-stage # The build directory was created inside the app # directory in the build-stage. The files inside # that folder can be put directly into the html # folder that you just set as your working directory COPY --from=build-stage /app/build ./ # Step 10: Replace the default NGINX config with # the application's version # The absolute path to the default NGINX config # file is /etc/nginx/conf.d/default.conf —replace # it with the nginx.conf file provided in this folder COPY nginx.conf /etc/nginx/conf.d/default.conf # (No need to add a CMD because it's included in the base image) ```