* Avoid duplicate log entries So far the hassos-supervisor.service starts the hassos-supervisor script which in turn attaches to the Supervisor container. This causes stdout and stderr to be forwarded to the service unit, which in turn logs it in the journal. However, Docker too logs all stdout/stderr to the journal through the systemd-journald log driver. Do not attach to the Supervisor container to avoid logging the Supervisor twice. Note that this no longer forwards signals to the container. However, the hassos-supervisor.service uses the ExecStop= setting to make sure the container gets gracefully stopped. * Use image and container name as syslog identifier By default Docker users the container id as syslog identifier. This leads to log messages which cannot easily be attributed to a particular container (since the container id is a random hex string). Use the image and container name as syslog identifier. Note that the Docker journald log driver still stores the container id as a separate field (CONTAINER_ID), in case the particular instance need to be tracked.
105 lines
4.5 KiB
Bash
Executable File
105 lines
4.5 KiB
Bash
Executable File
#!/bin/sh
|
|
# shellcheck disable=SC1091
|
|
# ==============================================================================
|
|
# Supervisor on HassOS
|
|
# ==============================================================================
|
|
set -e
|
|
|
|
# Load configs
|
|
. /etc/os-release
|
|
|
|
# Init supervisor
|
|
SUPERVISOR_DATA=/mnt/data/supervisor
|
|
SUPERVISOR_STARTUP_MARKER="/run/supervisor/startup-marker"
|
|
SUPERVISOR_STARTSCRIPT_VERSION="/mnt/data/.hassos-supervisor-version"
|
|
SUPERVISOR_IMAGE="homeassistant/${SUPERVISOR_ARCH}-hassio-supervisor"
|
|
|
|
SUPERVISOR_IMAGE_ID=$(docker images --no-trunc --filter "reference=${SUPERVISOR_IMAGE}:latest" --format "{{.ID}}" || echo "")
|
|
SUPERVISOR_CONTAINER_ID=$(docker inspect --format='{{.Image}}' hassio_supervisor || echo "")
|
|
|
|
# Check if previous run left the startup-marker in place. If so, we assume the
|
|
# Container image or container is somehow corrupted.
|
|
# Delete the container, delete the image, pull a fresh one
|
|
if [ -f "${SUPERVISOR_STARTUP_MARKER}" ]; then
|
|
echo "[WARNING] Supervisor container did not remove the startup marker file. Assuming container image or container corruption."
|
|
docker container rm --force hassio_supervisor || true
|
|
SUPERVISOR_CONTAINER_ID=""
|
|
# Make sure we delete all supervisor images
|
|
SUPERVISOR_IMAGE_IDS=$(docker images --no-trunc --filter "reference=${SUPERVISOR_IMAGE}" --format "{{.ID}}" | uniq || echo "")
|
|
docker image rm --force "${SUPERVISOR_IMAGE_IDS}" || true
|
|
SUPERVISOR_IMAGE_ID=""
|
|
fi
|
|
|
|
# If Supervisor image is missing, pull it
|
|
mkdir -p "$(dirname ${SUPERVISOR_STARTUP_MARKER})"
|
|
touch ${SUPERVISOR_STARTUP_MARKER}
|
|
if [ -z "${SUPERVISOR_IMAGE_ID}" ]; then
|
|
# Get the latest from update information
|
|
# Using updater information instead of config. If the config version is
|
|
# broken, this creates a way (e.g., bad release).
|
|
SUPERVISOR_VERSION=$(jq -r '.supervisor // "latest"' "${SUPERVISOR_DATA}/updater.json" || echo "latest")
|
|
|
|
echo "[WARNING] Supervisor image missing, downloading a fresh one: ${SUPERVISOR_VERSION}"
|
|
|
|
# Pull in the Supervisor
|
|
if docker pull "${SUPERVISOR_IMAGE}:${SUPERVISOR_VERSION}"; then
|
|
# Tag as latest if versioned
|
|
if [ "${SUPERVISOR_VERSION}" != "latest" ]; then
|
|
docker tag "${SUPERVISOR_IMAGE}:${SUPERVISOR_VERSION}" "${SUPERVISOR_IMAGE}:latest"
|
|
fi
|
|
else
|
|
# Pull failed, updater info might be corrupted, re-trying with latest
|
|
echo "[WARNING] Supervisor downloading failed trying: latest"
|
|
docker pull "${SUPERVISOR_IMAGE}:latest"
|
|
fi
|
|
|
|
SUPERVISOR_IMAGE_ID=$(docker inspect --format='{{.Id}}' "${SUPERVISOR_IMAGE}" || echo "")
|
|
fi
|
|
|
|
if [ -n "${SUPERVISOR_CONTAINER_ID}" ]; then
|
|
# Image changed, remove previous container
|
|
if [ "${SUPERVISOR_IMAGE_ID}" != "${SUPERVISOR_CONTAINER_ID}" ]; then
|
|
echo "[INFO] Supervisor image has been updated, destroying previous container..."
|
|
docker container rm --force hassio_supervisor || true
|
|
SUPERVISOR_CONTAINER_ID=""
|
|
fi
|
|
|
|
# Start script changed, remove previous container
|
|
# shellcheck disable=SC3013
|
|
if [ ! -f "${SUPERVISOR_STARTSCRIPT_VERSION}" ] || [ "${SUPERVISOR_STARTSCRIPT_VERSION}" -nt "$0" ] || [ "${SUPERVISOR_STARTSCRIPT_VERSION}" -ot "$0" ]; then
|
|
echo "[INFO] Supervisor start script has changed, destroying previous container..."
|
|
docker container rm --force hassio_supervisor || true
|
|
SUPERVISOR_CONTAINER_ID=""
|
|
fi
|
|
fi
|
|
|
|
# If Supervisor container is missing, create it
|
|
if [ -z "${SUPERVISOR_CONTAINER_ID}" ]; then
|
|
echo "[INFO] Creating a new Supervisor container..."
|
|
# shellcheck disable=SC2086
|
|
docker container create \
|
|
--name hassio_supervisor \
|
|
--privileged --security-opt apparmor="hassio-supervisor" \
|
|
-v /run/docker.sock:/run/docker.sock:rw \
|
|
-v /run/dbus:/run/dbus:ro \
|
|
-v /run/supervisor:/run/os:rw \
|
|
-v /run/udev:/run/udev:ro \
|
|
-v /etc/machine-id:/etc/machine-id:ro \
|
|
-v ${SUPERVISOR_DATA}:/data:rw \
|
|
-e SUPERVISOR_SHARE=${SUPERVISOR_DATA} \
|
|
-e SUPERVISOR_NAME=hassio_supervisor \
|
|
-e SUPERVISOR_CPU_RT=1 \
|
|
-e SUPERVISOR_MACHINE=${SUPERVISOR_MACHINE} \
|
|
"${SUPERVISOR_IMAGE}:latest"
|
|
|
|
# Store the timestamp of this script. If the script changed, let's
|
|
# recreate the container automatically.
|
|
touch --reference="$0" "${SUPERVISOR_STARTSCRIPT_VERSION}"
|
|
fi
|
|
|
|
# Run supervisor
|
|
mkdir -p ${SUPERVISOR_DATA}
|
|
echo "[INFO] Starting the Supervisor..."
|
|
docker container start hassio_supervisor
|
|
exec docker container wait hassio_supervisor
|