blob: 4f5a0960e1dc32dd34012f1da83358955490617d [file] [log] [blame]
#!/bin/bash
set -e
set -o pipefail
TOOLBOX_DOCKER_IMAGE=fedora
TOOLBOX_DOCKER_TAG=latest
TOOLBOX_USER=root
TOOLBOX_DIRECTORY="/var/lib/toolbox"
TOOLBOX_BIND="--bind=/:/media/root --bind=/usr:/media/root/usr --bind=/run:/media/root/run"
# Ex: "--setenv=KEY=VALUE"
TOOLBOX_ENV=""
TOOLBOX_DOCKER_IMAGE_TARBALL=""
TOOLBOX_TEMP_DIR=$(mktemp -d)
toolboxrc="${HOME}"/.toolboxrc
# System defaults
if [ -f "/etc/default/toolbox" ]; then
source "/etc/default/toolbox"
fi
# User overrides
if [ -f "${toolboxrc}" ]; then
source "${toolboxrc}"
fi
machinename=$(echo "${USER}-${TOOLBOX_DOCKER_IMAGE}-${TOOLBOX_DOCKER_TAG}" | sed -r 's/[^a-zA-Z0-9_.-]/_/g')
machinepath="${TOOLBOX_DIRECTORY}/${machinename}"
osrelease="${machinepath}/etc/os-release"
if [ ! -f ${osrelease} ] ; then
sudo mkdir -p "${machinepath}"
sudo mkdir -p "${TOOLBOX_TEMP_DIR}"
sudo chown ${USER}: "${machinepath}"
if [ ! -z "${TOOLBOX_DOCKER_IMAGE_TARBALL}" ] ; then
sudo ctr image import "${TOOLBOX_DOCKER_IMAGE_TARBALL}"
else
if [[ "${TOOLBOX_DOCKER_IMAGE}" =~ ^[a-z.]*gcr.io/ ]]; then
# Get a host part of the container name
registry_host="${TOOLBOX_DOCKER_IMAGE/gcr.io*/gcr.io}"
# docker-credential-gcr can fail if it runs in a
# non-GCP env, so let it fail and proceed without
# --user flag in this case
credentials=$(echo "${registry_host}" | \
(/usr/bin/docker-credential-gcr get || true) 2>/dev/null | \
jq -r '.Username + ":" + .Secret')
if [[ -n "${credentials}" ]]; then
user_flags=('--user' "${credentials}")
fi
fi
sudo ctr image pull "${user_flags[@]}" "${TOOLBOX_DOCKER_IMAGE}:${TOOLBOX_DOCKER_TAG}"
fi
# The below command is finding the short SHA256 prefix of the container
# image.
container256hash=$(sudo ctr image ls | grep "${TOOLBOX_DOCKER_IMAGE}:${TOOLBOX_DOCKER_TAG}" | awk '{ print $3 }' | cut -d':' -f2 | cut -c-12)
containername=$(echo "${USER}-${container256hash}" | sed -r 's/[^a-zA-Z0-9_.-]/_/g')
sudo ctr containers create "${TOOLBOX_DOCKER_IMAGE}:${TOOLBOX_DOCKER_TAG}" ${containername} /bin/true
sudo ctr snapshot mounts "${TOOLBOX_TEMP_DIR}" ${containername} | xargs sudo
sudo rsync -a "${TOOLBOX_TEMP_DIR}/" "${machinepath}"
sudo umount "${TOOLBOX_TEMP_DIR}"
sudo ctr container rm ${containername}
sudo rm -rf "${TOOLBOX_TEMP_DIR}"
sudo touch ${osrelease}
fi
sudo SYSTEMD_NSPAWN_SHARE_SYSTEM=1 systemd-nspawn \
--directory="${machinepath}" \
--capability=all \
--resolv-conf="replace-host" \
${TOOLBOX_BIND} \
${TOOLBOX_ENV} \
--user="${TOOLBOX_USER}" "$@"