#!/bin/bash

human_bytes() {
  b="$1"
  if [ "$b" = "0" ] || [ -z "$b" ]; then
    echo "unlimited"
    return
  fi
  mib=$((b / 1024 / 1024))
  if [ "$mib" -ge 1024 ]; then
    gib=$((mib / 1024))
    echo "${gib}GiB"
  else
    echo "${mib}MiB"
  fi
}

printf "%-28s %-10s %-10s %-10s %-6s\n" "CONTAINER" "MEM" "SWAP" "STATUS" "OOM"
printf "%-28s %-10s %-10s %-10s %-6s\n" "---------" "---" "----" "------" "---"

for c in $(docker ps -aq); do
  name=$(docker inspect -f '{{.Name}}' "$c" 2>/dev/null | sed 's#^/##')
  mem=$(docker inspect -f '{{.HostConfig.Memory}}' "$c" 2>/dev/null)
  swap=$(docker inspect -f '{{.HostConfig.MemorySwap}}' "$c" 2>/dev/null)
  status=$(docker inspect -f '{{.State.Status}}' "$c" 2>/dev/null)
  oom=$(docker inspect -f '{{.State.OOMKilled}}' "$c" 2>/dev/null)

  printf "%-28s %-10s %-10s %-10s %-6s\n" \
    "$name" "$(human_bytes "$mem")" "$(human_bytes "$swap")" "$status" "$oom"
done
