Docker

Useful commands

Build Image

docker build . -t $TAG

# no cache: --no-cache
# build args (like env vars): --build-arg NPM_TOKEN=$NPM_TOKEN

With file in monorepo:

docker build -t $TAG -f $FILE --build-arg NAME=value .

Check size

# save image
docker save $NAME -o $OUTPUT_FILE.tar

# login to image and run the following:
# root
du -h -s app/ bin/ dev/ etc/ home/ lib/ lib64/ media/ opt/ run/ sbin/ srv/ sys/ tmp/ usr/ var/

# usr
du -h -s bin/ include/ lib libexec/ local/ sbin/ share/

# app
du -h -s apps/ node_modules/ packages/

# by size
du -h | sort -h

Check vulnerabilities

trivy image $TAG --scanners vuln

Run Image

# --net=host publishes host network to container, use it only for testing!
docker run --name $NAME -p 8080:8080 --net=host -d $TAG

# stop it with
docker stop $NAME

Monitoring

# images
docker images

# running container
docker ps

# logs
docker logs -f --tail 100 $NAME

# watch running instances
watch docker ps

Clean up (more here)

# Removing unused containers
docker ps --filter status=exited --filter status=dead -q
docker rm $(docker ps --filter=status=exited --filter=status=dead -q)

# Removing dangling images
docker images --filter dangling=true -q
docker rmi $(docker images --filter dangling=true -q)

Navigate docker image

docker run -it $TAG sh

Stop all running containers

docker stop $(docker ps -a -q)

Remove all containers

docker rm $(docker ps -aq)

Dockerfile Best Practices

Use the right Node base image: https://snyk.io/blog/choosing-the-best-node-js-docker-image/

dockerfile best practices

Using dumb-init

# https://github.com/Yelp/dumb-init
RUN apk add dumb-init

Avoid calling npm, use instead:

EXPOSE 8080
CMD ["dumb-init", "node", "dist/index.js"]

Non user example:

FROM node:10-alpine

RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app

WORKDIR /home/node/app

COPY package*.json ./

USER node

RUN npm install

COPY --chown=node:node . .

EXPOSE 8080

CMD [ "node", "app.js" ]

Docker Compose

Local build:

services:
  web:
    build:
      context: project-root
      dockerfile: dockerfile-path
    ports:
      - "8080:8080"

Last updated