#!/usr/bin/env bash set -euo pipefail image="${DEVENV_IMAGE:-devenv}" container="${DEVENV_CONTAINER:-devenv}" home_volume="${DEVENV_HOME_VOLUME:-${container}-home}" build_context="${DEVENV_BUILD_CONTEXT:-https://github.com/zhuorantan/devenv.git}" workspace="${PWD}" root=0 action=run usage() { cat <-home EOF } build_image() { docker build -t "$image" "$build_context" } case "${1:-}" in build) action=build shift ;; clean) docker rm -f "$container" >/dev/null 2>&1 || true exit ;; reset) printf 'Delete container %s and home volume %s? [y/N] ' "$container" "$home_volume" >&2 read -r answer case "$answer" in y | Y | yes | YES) ;; *) printf 'Reset cancelled.\n' >&2 exit ;; esac docker rm -f "$container" >/dev/null 2>&1 || true docker volume rm "$home_volume" >/dev/null 2>&1 || true exit ;; -h | --help | help) usage exit ;; esac while [[ "$#" -gt 0 ]]; do case "$1" in --local) if [[ "$action" == "build" ]]; then build_context=. shift else usage >&2 exit 2 fi ;; -r | --root) root=1 shift ;; -w | --workspace) [[ "${2:-}" ]] || { usage >&2 exit 2 } workspace="$2" shift 2 ;; --) shift break ;; -*) usage >&2 exit 2 ;; *) break ;; esac done if [[ "$action" == "build" ]]; then build_image exit fi if ! docker image inspect "$image" >/dev/null 2>&1; then build_image fi uid="$(id -u)" gid="$(id -g)" home_mount=/home/me if [[ "$root" == "1" ]]; then uid=0 gid=0 home_mount=/root fi args=( --name "$container" --hostname "$(hostname -s)-devenv" --rm -it --detach-keys ctrl-@,ctrl-@ --security-opt seccomp=unconfined --security-opt apparmor=unconfined -e "HOST_UID=$uid" -e "HOST_GID=$gid" -v "$home_volume:$home_mount" -v "$workspace:/workspace" ) if [[ -S /var/run/docker.sock ]]; then args+=(-v /var/run/docker.sock:/var/run/docker.sock) fi if [[ "$(uname -s)" == "Darwin" && -n "${SSH_AUTH_SOCK:-}" ]]; then args+=( -e SSH_AUTH_SOCK=/ssh-agent -v /run/host-services/ssh-auth.sock:/ssh-agent ) elif [[ -S "${SSH_AUTH_SOCK:-}" ]]; then args+=( -e SSH_AUTH_SOCK=/ssh-agent -v "$SSH_AUTH_SOCK:/ssh-agent" ) fi docker run "${args[@]}" "$image" "$@"