Last active
May 18, 2022 01:01
-
-
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# >>> 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