#!/bin/bash container=opengl image=thewtex/opengl port=6080 extra_run_args="" quiet="" show_help() { cat << EOF Usage: ${0##*/} [-h] [-q] [-c CONTAINER] [-i IMAGE] [-p PORT] [-r DOCKER_RUN_FLAGS] This script is a convenience script to run Docker images based on thewtex/opengl. It: - Makes sure docker is available - On Windows and Mac OSX, creates a docker machine if required - Informs the user of the URL to access the container with a web browser - Stops and removes containers from previous runs to avoid conflicts - Mounts the present working directory to /home/user/work on Linux and Mac OSX - Prints out the graphical app output log following execution - Exits with the same return code as the graphical app Options: -h Display this help and exit. -c Container name to use (default ${container}). -i Image name (default ${image}). -p Port to expose HTTP server (default ${port}). If an empty string, the port is not exposed. -r Extra arguments to pass to 'docker run'. E.g. --env="APP=glxgears" -q Do not output informational messages. EOF } while [ $# -gt 0 ]; do case "$1" in -h) show_help exit 0 ;; -c) container=$2 shift ;; -i) image=$2 shift ;; -p) port=$2 shift ;; -r) extra_run_args="$extra_run_args $2" shift ;; -q) quiet=1 ;; *) show_help >&2 exit 1 ;; esac shift done which docker 2>&1 >/dev/null if [ $? -ne 0 ]; then echo "Error: the 'docker' command was not found. Please install docker." exit 1 fi os=$(uname) if [ "${os}" != "Linux" ]; then vm=$(docker-machine active 2> /dev/null || echo "default") if ! docker-machine inspect "${vm}" &> /dev/null; then if [ -z "$quiet" ]; then echo "Creating machine ${vm}..." fi docker-machine -D create -d virtualbox --virtualbox-memory 2048 ${vm} fi docker-machine start ${vm} > /dev/null eval $(docker-machine env $vm --shell=sh) fi ip=$(docker-machine ip ${vm} 2> /dev/null || echo "localhost") url="http://${ip}:$port" cleanup() { docker stop $container >/dev/null # Attempt to delete container rm_output=$(docker rm -f $container 2>&1) rm_exit_code=$? if [[ $rm_exit_code != 0 ]]; then if [[ "$CIRCLECI" == "true" ]] && [[ $rm_output == *"Driver btrfs failed to remove"* ]]; then : # Ignore error because of https://circleci.com/docs/docker-btrfs-error/ else echo "$rm_output" return $rm_exit_code fi fi } running=$(docker ps -a -q --filter "name=${container}") if [ -n "$running" ]; then if [ -z "$quiet" ]; then echo "Stopping and removing the previous session..." echo "" fi cleanup fi if [ -z "$quiet" ]; then echo "" echo "Setting up the graphical application container..." echo "" if [ -n "$port" ]; then echo "Point your web browser to ${url}" echo "" fi fi pwd_dir="`cd $(dirname $0)/../..; pwd`" mount_local="" if [ "${os}" = "Linux" ] || [ "${os}" = "Darwin" ]; then mount_local=" -v ${pwd_dir}:/usr/src/CTK " fi port_arg="" if [ -n "$port" ]; then port_arg="-p $port:6080" fi docker run \ -d \ --name $container \ ${mount_local} \ $port_arg \ $extra_run_args \ $image >/dev/null print_app_output() { docker cp $container:/var/log/supervisor/graphical-app-launcher.log - \ | tar xO result=$(docker cp $container:/tmp/graphical-app.return_code - \ | tar xO) cleanup exit $result } trap "docker stop $container >/dev/null && print_app_output" SIGINT SIGTERM docker wait $container >/dev/null print_app_output # vim: noexpandtab shiftwidth=4 tabstop=4 softtabstop=0