#!/usr/bin/env bash
set -euo pipefail

if docker info >/dev/null 2>&1; then
  printf '%s\n' 'job Docker daemon is already ready'
  exit 0
fi

storage_size=${DOCKER_DATA_SIZE:-20G}
storage_driver=${DOCKER_STORAGE_DRIVER:-overlay2}
wait_seconds=${DOCKER_START_WAIT_SECONDS:-60}

sudo install -d /var/lib/docker
if ! mountpoint --quiet /var/lib/docker; then
  printf '%s\n' "preparing ${storage_size} loop-backed Docker storage"
  if [[ ! -e /dev/loop-control ]]; then
    sudo mknod /dev/loop-control c 10 237
  fi
  for minor in {0..7}; do
    if [[ ! -e "/dev/loop${minor}" ]]; then
      sudo mknod "/dev/loop${minor}" b 7 "$minor"
    fi
  done
  sudo truncate -s "$storage_size" /tmp/docker-data.img
  sudo mkfs.ext4 -F /tmp/docker-data.img
  loop_device=$(sudo losetup --find --show /tmp/docker-data.img)
  sudo mount "$loop_device" /var/lib/docker
else
  printf '%s\n' 'using mounted Docker storage at /var/lib/docker'
fi

if [[ -f /sys/fs/cgroup/cgroup.controllers ]]; then
  sudo sh -c '
    mkdir -p /sys/fs/cgroup/init
    while read -r pid; do
      printf "%s\n" "$pid" \
        >/sys/fs/cgroup/init/cgroup.procs 2>/dev/null || true
    done </sys/fs/cgroup/cgroup.procs
    sed -e "s/ / +/g" -e "s/^/+" \
      /sys/fs/cgroup/cgroup.controllers \
      >/sys/fs/cgroup/cgroup.subtree_control
  '
fi

sudo nohup dockerd \
  --host=unix:///var/run/docker.sock \
  --storage-driver="$storage_driver" \
  >/tmp/dockerd.log 2>&1 &
printf '%s\n' 'waiting for job Docker daemon'
for ((attempt = 0; attempt < wait_seconds; attempt++)); do
  if docker info >/dev/null 2>&1; then
    findmnt /var/lib/docker
    docker info --format \
      '{{json .ServerVersion}} {{json .Driver}} {{json .CgroupVersion}}'
    exit 0
  fi
  sleep 1
done

cat /tmp/dockerd.log
exit 1
