Add incremental dockerfiles

This commit is contained in:
sid palas
2023-01-25 17:55:51 -05:00
parent dc832ac671
commit dd5d7bff0b
29 changed files with 467 additions and 49 deletions

View File

@ -1,19 +0,0 @@
FROM node:19.4-alpine
# Create app directory
WORKDIR /usr/src/app
# Install app dependencies
# A wildcard is used to ensure both package.json AND package-lock.json are copied
# where available (npm@5+)
COPY package*.json ./
RUN npm install
# If you are building your code for production
# RUN npm ci --only=production
# Bundle app source
COPY ./src/ .
EXPOSE 3000
CMD [ "node", "index.js" ]

View File

@ -0,0 +1,7 @@
FROM node
COPY . .
RUN npm install
CMD [ "node", "index.js" ]

View File

@ -0,0 +1,9 @@
# Pin specific version
# Use alpine for reduced image size
FROM node:19.4-alpine
COPY . .
RUN npm install
CMD [ "node", "index.js" ]

View File

@ -0,0 +1,12 @@
# Pin specific version
# Use alpine for reduced image size
FROM node:19.4-alpine
# Specify working directory other than /
WORKDIR /usr/src/app
COPY . .
RUN npm install
CMD [ "node", "index.js" ]

View File

@ -0,0 +1,18 @@
# Pin specific version for stability
# Use alpine for reduced image size
FROM node:19.4-alpine
# Specify working directory other than /
WORKDIR /usr/src/app
# Copy only files required to install
# dependencies (better layer caching)
COPY package*.json ./
RUN npm install
# Copy remaining source code AFTER installing dependencies.
# Again, copy only the necessary files
COPY ./src/ .
CMD [ "node", "index.js" ]

View File

@ -0,0 +1,22 @@
# Pin specific version for stability
# Use alpine for reduced image size
FROM node:19.4-alpine
# Specify working directory other than /
WORKDIR /usr/src/app
# Copy only files required to install
# dependencies (better layer caching)
COPY package*.json ./
RUN npm install
# Use non-root user
# Use --chown on COPY commands to set file permissions
USER node
# Copy remaining source code AFTER installing dependencies.
# Again, copy only the necessary files
COPY --chown=node:node ./src/ .
CMD [ "node", "index.js" ]

View File

@ -0,0 +1,26 @@
# Pin specific version for stability
# Use alpine for reduced image size
FROM node:19.4-alpine
# Set NODE_ENV
ENV NODE_ENV production
# Specify working directory other than /
WORKDIR /usr/src/app
# Copy only files required to install
# dependencies (better layer caching)
COPY package*.json ./
# Install only production dependencies
RUN npm ci --only=production
# Use non-root user
# Use --chown on COPY commands to set file permissions
USER node
# Copy remaining source code AFTER installing dependencies.
# Again, copy only the necessary files
COPY --chown=node:node ./src/ .
CMD [ "node", "index.js" ]

View File

@ -0,0 +1,29 @@
# Pin specific version for stability
# Use alpine for reduced image size
FROM node:19.4-alpine
# Set NODE_ENV
ENV NODE_ENV production
# Specify working directory other than /
WORKDIR /usr/src/app
# Copy only files required to install
# dependencies (better layer caching)
COPY package*.json ./
# Install only production dependencies
RUN npm ci --only=production
# Use non-root user
# Use --chown on COPY commands to set file permissions
USER node
# Copy remaining source code AFTER installing dependencies.
# Again, copy only the necessary files
COPY --chown=node:node ./src/ .
# Indicate expected port
EXPOSE 3000
CMD [ "node", "index.js" ]

View File

@ -0,0 +1,36 @@
# Pin specific version for stability
# Use alpine for reduced image size
FROM node:19.4-alpine
# Set NODE_ENV
ENV NODE_ENV production
# Specify working directory other than /
WORKDIR /usr/src/app
# Copy only files required to install
# dependencies (better layer caching)
COPY package*.json ./
# Install only production dependencies
# Use cache mount to speed up install of existing dependencies
RUN --mount=type=cache,target=/usr/src/app/.npm \
npm set cache /usr/src/app/.npm && \
npm ci --only=production
# Use non-root user
# Use --chown on COPY commands to set file permissions
USER node
# Copy remaining source code AFTER installing dependencies.
# Again, copy only the necessary files
COPY --chown=node:node ./src/ .
# Indicate expected port
EXPOSE 3000
CMD [ "node", "index.js" ]
# TODO: Use multi-stage with distroless image or chainguard image?
# https://github.com/GoogleContainerTools/distroless/blob/main/examples/nodejs/Dockerfile
# https://edu.chainguard.dev/chainguard/chainguard-images/reference/node/overview/

View File

@ -5,4 +5,8 @@ run-local:
PGPASSWORD=foobarbaz \
PGDATABASE=postgres \
PGPORT=5432 \
node ./src/index.js
node ./src/index.js
.PHONY: build-naive
build-naive:
docker build --file ./Dockerfile.naive .

View File

@ -12,6 +12,13 @@ app.get('/', async (req, res) => {
res.send(response);
});
app.listen(port, () => {
const server = app.listen(port, () => {
console.log(`Example app listening on port ${port}`);
});
process.on('SIGTERM', () => {
debug('SIGTERM signal received: closing HTTP server');
server.close(() => {
debug('HTTP server closed');
});
});