#!/bin/bash # # DOCKER_CMD should be either `docker` or `podman`. # # if using (rootless) podman, remember to set /etc/subuid # and /etc/subgid. # docker_cmd=${DOCKER_CMD:-"docker"} [ "$DOCKER_CMD" = "podman" ] && userns_podman="--userns=keep-id" einfo() { echo "$*" >&2 } die() { echo "$*" >&2 exit 1 } # # The caller is expected to override the CONTAINER environment # variable with the container they wish to launch. # BASE="registry.gitlab.com/xen-project/xen" case "_${CONTAINER}" in _archlinux|_arch) CONTAINER="${BASE}/archlinux:current" ;; _centos6) CONTAINER="${BASE}/centos:6" ;; _centos7) CONTAINER="${BASE}/centos:7" ;; _centos72) CONTAINER="${BASE}/centos:7.2" ;; _fedora) CONTAINER="${BASE}/fedora:29";; _jessie) CONTAINER="${BASE}/debian:jessie" ;; _stretch|_) CONTAINER="${BASE}/debian:stretch" ;; _unstable|_) CONTAINER="${BASE}/debian:unstable" ;; _trusty) CONTAINER="${BASE}/ubuntu:trusty" ;; _xenial) CONTAINER="${BASE}/ubuntu:xenial" ;; _opensuse-leap|_leap) CONTAINER="${BASE}/suse:opensuse-leap" ;; _opensuse-tumbleweed|_tumbleweed) CONTAINER="${BASE}/suse:opensuse-tumbleweed" ;; esac # Use this variable to control whether root should be used case "_${CONTAINER_UID0}" in _1) userarg= ;; _0|_) userarg="-u $(id -u) $userns_podman" ;; esac # Save the commands for future use cmd=$@ # If no command was specified, just drop us into a shell if we're interactive [ $# -eq 0 ] && tty -s && cmd="/bin/bash" # Are we in an interactive terminal? tty -s && termint=t # # Fetch the latest version of the container in hub.docker.com, # unless it's a newly created local copy. # if [[ "_${CONTAINER_NO_PULL}" != "_1" ]]; then einfo "*** Ensuring ${CONTAINER} is up to date" ${docker_cmd} pull ${CONTAINER} > /dev/null || \ die "Failed to update container" fi if hash greadlink > /dev/null 2>&1; then READLINK=greadlink elif [[ $(uname -s) == "Darwin" ]]; then echo "Unable to forward SSH agent without coreutils installed" unset SSH_AUTH_SOCK else READLINK=readlink fi # Ensure we've got what we need for SSH_AUTH_SOCK if [[ -n ${SSH_AUTH_SOCK} ]]; then fullpath_sock=$(${READLINK} -f ${SSH_AUTH_SOCK} 2> /dev/null) if [ $? -ne 0 ]; then echo "Invalid SSH_AUTH_SOCK: ${SSH_AUTH_SOCK}" unset SSH_AUTH_SOCK else SSH_AUTH_DIR=$(dirname ${fullpath_sock}) SSH_AUTH_NAME=$(basename ${fullpath_sock}) fi fi # Figure out the base of what we want as our sources # by using the top of the git repo if [[ -z ${CONTAINER_PATH} ]]; then CONTAINER_PATH=$(git rev-parse --show-toplevel) fi # Kick off Docker einfo "*** Launching container ..." exec ${docker_cmd} run \ ${userarg} \ ${SSH_AUTH_SOCK:+-e SSH_AUTH_SOCK="/tmp/ssh-agent/${SSH_AUTH_NAME}"} \ -v "${CONTAINER_PATH}":/build:rw \ -v "${HOME}/.ssh":/root/.ssh:ro \ ${SSH_AUTH_DIR:+-v "${SSH_AUTH_DIR}":/tmp/ssh-agent} \ ${XEN_CONFIG_EXPERT:+-e XEN_CONFIG_EXPERT=${XEN_CONFIG_EXPERT}} \ ${CONTAINER_ARGS} \ -${termint}i --rm -- \ ${CONTAINER} \ ${cmd}