#! /bin/bash # Run R interpreter, optionally launching inside a docker container # Launch in docker iff a file called '.rundocker' exists and contains # the name of a valid image in the current directory ## TODO the env args here are not DRY system_r=(env "MAKEFLAGS=-j8" /bin/R --quiet "$@") # launch in docker if we find a .rundocker file if [ -f ".rundocker" ]; then image=$(cat .rundocker) if ! docker info > /dev/null 2>&1; then echo "Docker daemon not running" echo "Using Systemwide R Installation" "${system_r[@]}" fi if ! docker image inspect "$image" > /dev/null 2>&1; then echo "Invalid image: $image" echo "Using Systemwide R Installation" "${system_r[@]}" fi # TODO what about host user's environ file and such? # TODO not all images have a docker user # start container using the docker user user=docker # start container in docker's home directory work_dir=/home/docker # mount the current host directory to docker's user home pwd_mnt="type=bind,source=$(pwd),target=/home/docker" # add X11 socket/env so we can see pretty plots # from here https://github.com/rocker-org/rocker-versioned/tree/master/X11 xsock=/tmp/.X11-unix/X0 xauth=/tmp/.docker.xauth touch "$xauth" xauth nlist "$DISPLAY" | sed -e 's/^..../ffff/' | \ xauth -f "$xauth" nmerge - x11=(-v "$xsock:$xsock" -v "$xauth:$xauth" -e "XAUTHORITY=${xauth}" -e "DISPLAY=$DISPLAY") # for some reason this won't work if you aren't root opts=(-ti --rm -w "$work_dir" --mount "$pwd_mnt" -u 0 #--user "$user" "${x11[@]}") # TODO not all images have the same path for R # TODO add env vars somehow cmd=(/usr/local/bin/R --quiet "$@") # if we are in Emacs, do some special tricks to satisfy ESS if [[ -n "$INSIDE_EMACS" ]]; then # TODO do we need to pass any environmental variables? # ESS sends some 'source' commands to the running R process # after it starts; these are in the emacs user directory emacs_home="$XDG_CONFIG_HOME/emacs" emacs_mnt="type=bind,source=$emacs_home,target=$emacs_home" opts+=(--mount "$emacs_mnt") # ESS gets confused if lines are terminated with \r\n (which # unfortunately is the default in docker). Set the terminal # to not echo inputs before starting R docker run "${opts[@]}" "$image" /bin/sh -c "stty -echo -onlcr && ${cmd[*]}" else docker run "${opts[@]}" "$image" "${cmd[@]}" fi ## remove X11 auth file rm -f "$xauth" else "${system_r[@]}" fi