#!/bin/bash #set -x # if no arguments given, start with interactive terminal if test $# -lt 1; then args="-t -i paparazziuav/pprz-dev" else # Use this script with derived images, and pass your 'docker run' args args="$@" fi # check if running on Linux or OSX UNAME=$(uname -s) useX="${useX:-true}" ############################################################ # share this paparazzi directory with the container ############################################################ # set PAPARAZZI_SRC to this tree # on OSX: readlink doesn't have the -f or -m options, try using pwd if [ $UNAME == "Linux" ]; then SCRIPT=$(readlink -f $0) SCRIPT_DIR=$(dirname $(readlink -f $0)) PAPARAZZI_SRC=$(readlink -m $SCRIPT_DIR/..) else PAPARAZZI_SRC=$(dirname $(pwd)) fi # PAPARAZZI_HOME inside the container PPRZ_HOME_CONTAINER=/home/pprz/paparazzi # share the paparazzi directory and set it as working directory SHARE_PAPARAZZI_HOME_OPTS="--volume=$PAPARAZZI_SRC:$PPRZ_HOME_CONTAINER \ --env=PAPARAZZI_HOME=$PPRZ_HOME_CONTAINER \ --env=PAPARAZZI_SRC=$PPRZ_HOME_CONTAINER \ -w $PPRZ_HOME_CONTAINER" ############################################################ # grant access to X-Server ############################################################ if [ $useX = "true" ] then if [ $UNAME == "Linux" ]; then XSOCK=/tmp/.X11-unix XAUTH=/tmp/.docker.xauth touch $XAUTH xauth nlist $DISPLAY | sed -e 's/^..../ffff/' | xauth -f $XAUTH nmerge - # options to grant access to the Xserver X_WINDOW_OPTS="--volume=$XSOCK:$XSOCK --volume=$XAUTH:$XAUTH --env=XAUTHORITY=${XAUTH} --env=DISPLAY=${DISPLAY}" fi # using xauth with docker on OSX doesn't work, so we use socat: # see https://github.com/docker/docker/issues/8710 if [ $UNAME == "Darwin" ]; then X_WINDOW_OPTS="--env=DISPLAY=192.168.99.1:0" TCPPROXY="socat TCP-LISTEN:6000,reuseaddr,fork UNIX-CLIENT:\"$DISPLAY\"" fi fi ############################################################ # Audio ############################################################ if [ $UNAME == "Linux" ]; then # pass audio to pulseaudio server on host USER_UID=$(id -u) PULSE_AUDIO_OPTS="--volume=/run/user/${USER_UID}/pulse:/run/pulse" fi ############################################################ # USB ############################################################ # give the container access to USB, WARNING runs it as priviliged container! # use it if ENABLE_USB variable is non-empty/zero if [ -n "$PRIVILEGED_USB" ]; then echo "WARNING: running as priviliged container to enable complete USB access!" echo "Better pass devices explicitly: ./run.sh -i -t --device=/dev/ttyUSB0 paparazziuav/pprz-dev bash" USB_OPTS="--privileged --volume=/dev/bus/usb:/dev/bus/usb" fi # try to detect which USB devices to pass to the container automatically # set DISABLE_USB=1 to turn it off if [ -z "$DISABLE_USB" ]; then # get major/minor docker version without the dot DOCKER_VERSION=$(docker version | grep -m 1 Version: | awk '{print $2}' | cut -f1,2 -d. | tr -d .) # docker should support relative symlinks for --device options since 1.12 if [ "$DOCKER_VERSION" -ge 112 ]; then # find on OSX doesn't have the -printf option... so use exec echo instead USB_OPTS=$(find /dev -maxdepth 2 \( -name "ttyACM?" -or -name "ttyUSB?" -or -name "bmp-*" -or -path /dev/paparazzi/* \) -exec echo -n "--device={} " \; 2> /dev/null) else USB_OPTS=$(find /dev -maxdepth 1 \( -name "ttyACM?" -or -name "ttyUSB?" \) -exec echo -n "--device={} " \; 2> /dev/null) fi if [ -n "$USB_OPTS" ]; then echo Passing auto-detected USB devices: $USB_OPTS fi fi ############################################################ # Run it! ############################################################ if [ $UNAME == "Darwin" ]; then # start socat in background to forward the X socket via TCP $TCPPROXY & fi # run the docker container with all the fancy options docker run \ ${X_WINDOW_OPTS} \ ${PULSE_AUDIO_OPTS} \ ${USB_OPTS} \ ${SHARE_PAPARAZZI_HOME_OPTS} \ -e LOCAL_USER_ID=`id -u` \ -e LOCAL_GROUP_ID=`id -g` \ --rm $args # remember exit status EXIT_STATUS=$? ############################################################ # cleanup after exiting from docker container ############################################################ # cleanup XAUTHORITY file again rm -f $XAUTH # on OSX kill background socat process again if [ $UNAME == "Darwin" ]; then pkill -f "$TCPPROXY" fi exit $EXIT_STATUS