Skip to content

Instantly share code, notes, and snippets.

@dantonnoriega
Last active May 18, 2022 01:01
Show Gist options
  • Save dantonnoriega/1689334c88e5276ff73d56ffcd9325e0 to your computer and use it in GitHub Desktop.
Save dantonnoriega/1689334c88e5276ff73d56ffcd9325e0 to your computer and use it in GitHub Desktop.
A helpful script to add to your .zshrc file that creates functions to start and stop docker containers and open up Rstudio in a browser.
# >>> DOCKER >>>
# start `n` docker containers in safari (default 1)
# option to start in current working directory `--here`; looks for .Rproj and hooks
# usage `docker-start [-n num_session] [--here] [<some_docker_image>] [<where_your_repos_live>]`
function docker-start () {
docker-start-usage() { echo "docker-start [-n num_session] [--here] [<some_docker_image>] [<where_your_repos_live>]" 1>&2; }
# https://stackoverflow.com/a/26920580
here_flag=0
# https://stackoverflow.com/a/7680682
while getopts "n:-:" optchar; do
case "${optchar}" in
-)
case "${OPTARG}" in
here)
here_flag=1
;;
*)
echo "Unknown option --${OPTARG}" 1>&2
return 1
;;
esac
;;
n)
n="${OPTARG}"
;;
*)
docker-start-usage
return 1
;;
esac
done
shift $((OPTIND-1))
# set defaults -----
RUN_CONTAINER={1:-rocker/rstudio}
NUM_SESSIONS=${n:-1}
REPO_DIR=${2:-$HOME/github} # where all your repos live
# overrides -----
# here_flag overrides $REPO_DIR defaults
((here_flag)) && REPO_DIR=$(pwd)
VOLUME="/home/rstudio/$(basename $REPO_DIR)"
echo $REPO_DIR $VOLUME
# spin up a docker container
spin-docker() {
BASE_PORT1=3838
BASE_PORT2=8787
INCREMENT=1
port1=$BASE_PORT1
isfree=$(netstat -taln | grep $port1)
while [[ -n "$isfree" ]]; do
port1=$[port1+INCREMENT]
isfree=$(netstat -taln | grep $port1)
done
port2=$BASE_PORT2
isfree=$(netstat -taln | grep $port2)
while [[ -n "$isfree" ]]; do
port2=$[port2+INCREMENT]
isfree=$(netstat -taln | grep $port2)
done
# rstudio configs for 1.3 or earlier:
## -v $HOME/.config/rstudio:/home/rstudio/.config/rstudio \
# rstudio configs for 1.2 or earlier; wont copy layout or themes:
## -v $HOME/.config/rstudio/keybindings:/home/rstudio/.R/rstudio/keybindings \
## -v $HOME/.config/rstudio/snippets:/home/rstudio/.R/snippets \
docker run -d -e PASSWORD=1234 -p $port1:3838 -p $port2:8787 \
-v $REPO_DIR:$VOLUME \
$RUN_CONTAINER
# echo $RUN_CONTAINER $REPO_DIR
CONTAINER=$(docker ps -l | grep $port2 | sed -E 's/[ ][ ]+/|/g' | cut -d'|' -f7)
docker exec $CONTAINER bash -c "mkdir -p /home/rstudio/.config/rstudio"
docker exec $CONTAINER bash -c "mkdir -p /home/rstudio/.R/rstudio"
docker cp $HOME/.config/rstudio $CONTAINER:/home/rstudio/.config/rstudio
docker cp $HOME/.config/rstudio/keybindings $CONTAINER:/home/rstudio/.R/rstudio/keybindings
docker cp $HOME/.config/rstudio/snippets $CONTAINER:/home/rstudio/.R/snippets
docker cp $HOME/.Rprofile $CONTAINER:/home/rstudio/.Rprofile
docker cp $HOME/.Renviron $CONTAINER:/home/rstudio/.Renviron
docker exec $CONTAINER bash -c 'chown -R rstudio:rstudio /home/rstudio/.config'
docker exec $CONTAINER bash -c 'chown -R rstudio:rstudio /home/rstudio/.R'
docker exec $CONTAINER bash -c 'chown -R rstudio:rstudio /home/rstudio/.Rprofile'
docker exec $CONTAINER bash -c 'chown -R rstudio:rstudio /home/rstudio/.Renviron'
echo $port2 $CONTAINER
# open up current project in directory if --here is used
# hacked from
# https://community.rstudio.com/t/how-to-set-the-default-startup-project-in-rocker-tidyverse/63092/2
RPROJ=$(ls -1 $REPO_DIR | grep Rproj | head -n 1)
if [[ $here_flag==1 && ! -z $RPROJ ]]; then
RPROJ="$VOLUME/$(basename $RPROJ)"
docker exec -it $CONTAINER bash -c "
cat << EOF >> /home/rstudio/.Rprofile
setHook('rstudio.sessionInit', function(newSession) {
if (newSession && is.null(rstudioapi::getActiveProject())) try(rstudioapi::openProject(\"$RPROJ\"))
}, action = 'append')
EOF"
fi
# open container in application (-a) safari but in the background (-g)
open -g -a safari http://localhost:$port2
}
# spin up docker containers
[[ $NUM_SESSIONS > 1 ]] && echo "Spinning up $NUM_SESSIONS session"
for i in $(seq 1 $NUM_SESSIONS); do spin-docker; done
}
alias docker-stop-all='docker stop $(docker ps -q)'
function docker-stop () {
LATEST=$(docker ps -lq)
CONTAINER=${1:-$LATEST}
docker stop $CONTAINER
}
function docker-bash () {
LATEST=$(docker ps -lq)
CONTAINER=${1:-$LATEST}
docker exec -e curdir=$PWD -it $CONTAINER bash
}
# <<< DOCKER <<<
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment