#!/bin/bash ###################################### # .dockerfunc # ------------ # Bash wrappers for docker run commands # # Based on the amazing work of Jess Frazelle # # :author: Levi Olson # :date: 1 Feb 2018 # :version: 0.0.1 ###################################### export DOCKER_REPO_PREFIX=jess dcleanup() { local containers mapfile -t containers < <(docker ps -aq 2>/dev/null) docker rm "${containers[@]}" 2>/dev/null local volumes mapfile -t volumes < <(docker ps --filter status=exited -q 2>/dev/null) docker rm -v "${volumes[@]}" 2>/dev/null local images mapfile -t images < <(docker images --filter dangling=true -q 2>/dev/null) docker rmi "${images[@]}" 2>/dev/null } del_stopped() { local name=$1 local state state=$(docker inspect --format "{{.State.Running}}" "$name" 2>/dev/null) if [[ "$state" == "false" ]]; then docker rm "$name" fi } relies_on() { for container in "$@"; do local state state=$(docker inspect --format "{{.State.Running}}" "$container" 2>/dev/null) if [[ "$state" == "false" ]] || [[ "$state" == "" ]]; then echo "$container is not running, starting it for you." $container fi done } ###################### # Container Aliases # --------------------- ###################### aws() { docker run -it --rm \ -v "${HOME}/.aws:/root/.aws" \ --log-driver none \ --name aws \ ${DOCKER_REPO_PREFIX}/awscli "$@" } cadvisor() { docker run -d \ --restart always \ -v /:/rootfs:ro \ -v /var/run:/var/run:rw \ -v /sys:/sys:ro \ -v /var/lib/docker/:/var/lib/docker:ro \ -p 1234:8080 \ --name cadvisor \ google/cadvisor hostess add cadvisor "$(docker inspect --format '{{.NetworkSettings.Networks.bridge.IPAddress}}' cadvisor)" browser-exec "http://cadvisor:8080" } chrome() { # add flags for proxy if passed local proxy= local map local args=$* if [[ "$1" == "tor" ]]; then relies_on torproxy map="MAP * ~NOTFOUND , EXCLUDE torproxy" proxy="socks5://torproxy:9050" args="https://check.torproject.org/api/ip ${*:2}" fi del_stopped chrome # one day remove /etc/hosts bind mount when effing # overlay support inotify, such bullshit docker run -d \ --memory 6gb \ -v /etc/localtime:/etc/localtime:ro \ -v /tmp/.X11-unix:/tmp/.X11-unix \ -e "DISPLAY=unix${DISPLAY}" \ -v "${HOME}/Downloads:/root/Downloads" \ -v "${HOME}/Pictures:/root/Pictures" \ -v "${HOME}/Torrents:/root/Torrents" \ -v "${HOME}/.chrome:/data" \ -v /dev/shm:/dev/shm \ -v /etc/hosts:/etc/hosts \ --security-opt seccomp:$HOME/chrome.json \ --device /dev/snd \ --device /dev/dri \ --device /dev/video0 \ --device /dev/usb \ --device /dev/bus/usb \ --group-add audio \ --group-add video \ --name chrome \ ${DOCKER_REPO_PREFIX}/chrome --user-data-dir=/data \ --proxy-server="$proxy" \ --host-resolver-rules="$map" "$args" } chromium() { # add flags for proxy if passed local proxy= local map local args=$* if [[ "$1" == "tor" ]]; then relies_on torproxy map="MAP * ~NOTFOUND , EXCLUDE torproxy" proxy="socks5://torproxy:9050" args="https://check.torproject.org/api/ip ${*:2}" fi del_stopped chromium # one day remove /etc/hosts bind mount when effing # overlay support inotify, such bullshit docker run -d \ --memory 6gb \ -v /etc/localtime:/etc/localtime:ro \ -v /tmp/.X11-unix:/tmp/.X11-unix \ -e "DISPLAY=unix${DISPLAY}" \ -v "${HOME}/Downloads:/root/Downloads" \ -v "${HOME}/Pictures:/root/Pictures" \ -v "${HOME}/Torrents:/root/Torrents" \ -v "${HOME}/.chrome:/data" \ -v /dev/shm:/dev/shm \ -v /etc/hosts:/etc/hosts \ --security-opt seccomp:$HOME/chrome.json \ --device /dev/snd \ --device /dev/dri \ --device /dev/video0 \ --device /dev/usb \ --device /dev/bus/usb \ --group-add audio \ --group-add video \ --name chromium \ ${DOCKER_REPO_PREFIX}/chromium --user-data-dir=/data \ --proxy-server="$proxy" \ --host-resolver-rules="$map" "$args" } firefox() { del_stopped firefox relies_on pulseaudio docker run -d \ --memory 6gb \ --net host \ --cpuset-cpus 0 \ -v /etc/localtime:/etc/localtime:ro \ -v /tmp/.X11-unix:/tmp/.X11-unix \ -v "${HOME}/.cache/mozilla:/root/.cache/mozilla" \ -v "${HOME}/.mozilla:/root/.mozilla" \ -v "${HOME}/Downloads:/root/Downloads" \ -v "${HOME}/Pictures:/root/Pictures" \ -v "${HOME}/Torrents:/root/Torrents" \ -e "DISPLAY=unix${DISPLAY}" \ -e GDK_SCALE \ -e GDK_DPI_SCALE \ --device /dev/snd \ --device /dev/dri \ --name firefox \ ${DOCKER_REPO_PREFIX}/firefox "$@" } gimp() { del_stopped gimp docker run -d \ -v /etc/localtime:/etc/localtime:ro \ -v /tmp/.X11-unix:/tmp/.X11-unix \ -e "DISPLAY=unix${DISPLAY}" \ -v "${HOME}/Pictures:/root/Pictures" \ -v "${HOME}/.gtkrc:/root/.gtkrc" \ -e GDK_SCALE \ -e GDK_DPI_SCALE \ --name gimp \ ${DOCKER_REPO_PREFIX}/gimp } hollywood() { docker run --rm -it \ --name hollywood \ ${DOCKER_REPO_PREFIX}/hollywood } htop() { docker run --rm -it \ --pid host \ --net none \ --name htop \ ${DOCKER_REPO_PREFIX}/htop } mpd() { del_stopped mpd # adding cap sys_admin so I can use nfs mount # the container runs as a unpriviledged user mpd docker run -d \ --device /dev/snd \ --cap-add SYS_ADMIN \ -e MPD_HOST=/var/lib/mpd/socket \ -v /etc/localtime:/etc/localtime:ro \ -v /etc/exports:/etc/exports:ro \ -v "${HOME}/.mpd:/var/lib/mpd" \ -v "${HOME}/.mpd.conf:/etc/mpd.conf" \ --name mpd \ ${DOCKER_REPO_PREFIX}/mpd } nes() { del_stopped nes local game=$1 docker run -d \ -v /tmp/.X11-unix:/tmp/.X11-unix \ -e "DISPLAY=unix${DISPLAY}" \ --device /dev/dri \ --device /dev/snd \ --name nes \ ${DOCKER_REPO_PREFIX}/nes "/games/${game}.rom" } pulseaudio() { del_stopped pulseaudio docker run -d \ -v /etc/localtime:/etc/localtime:ro \ --device /dev/snd \ -p 4713:4713 \ --restart always \ --group-add audio \ --name pulseaudio \ ${DOCKER_REPO_PREFIX}/pulseaudio } spotify() { del_stopped spotify docker run -d \ -v /etc/localtime:/etc/localtime:ro \ -v /tmp/.X11-unix:/tmp/.X11-unix \ -v "${HOME}/.spotify:/home/spotify/.spotify" \ -v "${HOME}/.cache/spotify:/home/spotify/.cache/spotify" \ -e "DISPLAY=unix${DISPLAY}" \ -e QT_DEVICE_PIXEL_RATIO \ --security-opt seccomp:unconfined \ --device /dev/snd \ --device /dev/dri \ --group-add audio \ --group-add video \ --name spotify \ ${DOCKER_REPO_PREFIX}/spotify } steam() { del_stopped steam relies_on pulseaudio docker run -d \ -v /etc/localtime:/etc/localtime:ro \ -v /etc/machine-id:/etc/machine-id:ro \ -v /var/run/dbus:/var/run/dbus \ -v /tmp/.X11-unix:/tmp/.X11-unix \ -v "${HOME}/.steam:/home/steam" \ -e "DISPLAY=unix${DISPLAY}" \ --link pulseaudio:pulseaudio \ -e PULSE_SERVER=pulseaudio \ --device /dev/dri \ --name steam \ ${DOCKER_REPO_PREFIX}/steam } telnet() { docker run -it --rm \ --log-driver none \ ${DOCKER_REPO_PREFIX}/telnet "$@" } termboy() { del_stopped termboy local game=$1 docker run --rm -it \ --device /dev/snd \ --name termboy \ ${DOCKER_REPO_PREFIX}/nes "/games/${game}.rom" } tor() { del_stopped tor docker run -d \ --net host \ --name tor \ ${DOCKER_REPO_PREFIX}/tor # set up the redirect iptables rules sudo setup-tor-iptables # validate we are running through tor browser-exec "https://check.torproject.org/" # exit current shell # exit 0 } torbrowser() { del_stopped torbrowser docker run -d \ -v /etc/localtime:/etc/localtime:ro \ -v /tmp/.X11-unix:/tmp/.X11-unix \ -e "DISPLAY=unix${DISPLAY}" \ -e GDK_SCALE \ -e GDK_DPI_SCALE \ --device /dev/snd \ --name torbrowser \ ${DOCKER_REPO_PREFIX}/tor-browser # exit current shell # exit 0 } tormessenger() { del_stopped tormessenger docker run -d \ -v /etc/localtime:/etc/localtime:ro \ -v /tmp/.X11-unix:/tmp/.X11-unix \ -e "DISPLAY=unix${DISPLAY}" \ -e GDK_SCALE \ -e GDK_DPI_SCALE \ --device /dev/snd \ --name tormessenger \ ${DOCKER_REPO_PREFIX}/tor-messenger # exit current shell # exit 0 } torproxy() { del_stopped torproxy docker run -d \ --restart always \ -v /etc/localtime:/etc/localtime:ro \ -p 9050:9050 \ --name torproxy \ ${DOCKER_REPO_PREFIX}/tor-proxy hostess add torproxy "$(docker inspect --format '{{.NetworkSettings.Networks.bridge.IPAddress}}' torproxy)" } traceroute() { docker run --rm -it \ --net host \ ${DOCKER_REPO_PREFIX}/traceroute "$@" } transmission() { del_stopped transmission docker run -d \ -v /etc/localtime:/etc/localtime:ro \ -v "${HOME}/Torrents:/transmission/download" \ -v "${HOME}/.transmission:/transmission/config" \ -p 9091:9091 \ -p 51413:51413 \ -p 51413:51413/udp \ --name transmission \ ${DOCKER_REPO_PREFIX}/transmission hostess add transmission "$(docker inspect --format '{{.NetworkSettings.Networks.bridge.IPAddress}}' transmission)" browser-exec "http://transmission:9091" } wireshark() { del_stopped wireshark docker run -d \ -v /etc/localtime:/etc/localtime:ro \ -v /tmp/.X11-unix:/tmp/.X11-unix \ -e "DISPLAY=unix${DISPLAY}" \ --cap-add NET_RAW \ --cap-add NET_ADMIN \ --net host \ --name wireshark \ ${DOCKER_REPO_PREFIX}/wireshark }