exit 1
}
-CONTAINER=${1}
-[ "x${CONTAINER}" == "x" ] && die "You must supply a container name as the first argument."
-shift
-docker exec -it "${CONTAINER}" bash "${@}"
+usage() {
+ cat <<EOF
+dssh: log in to a docker node
+
+usage: dssh: [options]
+
+options:
+-h: show this help message.
+-i [ID]: ssh into a docker node with this container ID
+-n [name]: ssh into a docker node with this name
+-t [0 or 1]: 0 to avoid allocating a TTY; 1 to allocate one.
+ The default will be set based on whether this appears
+ to be an interactive shell.
+EOF
+}
+
+DOCKER_IMAGE_ID=""
+DOCKER_IMAGE_NAME=""
+if [ -t 0 ]; then
+ ALLOCATE_TTY=1
+else
+ ALLOCATE_TTY=0
+fi
+while getopts "hi:n:t:" flag; do
+ case $flag in
+ h) usage; exit 0;;
+ i) DOCKER_IMAGE_ID=${OPTARG};;
+ n) DOCKER_IMAGE_NAME=${OPTARG};;
+ t) ALLOCATE_TTY=${OPTARG};;
+ *) echo "getopts error"
+ echo
+ usage
+ exit 1;;
+ esac
+done
+shift $(expr $OPTIND - 1)
+if [ $# -eq 0 ]; then
+ RUN_COMMAND="/bin/bash"
+else
+ RUN_COMMAND=""
+fi
+
+which docker &>/dev/null || die "docker must be on the PATH."
+
+if [ "x${DOCKER_IMAGE_NAME}" == "x" ]; then
+ if [ "x${DOCKER_IMAGE_ID}" == "x" ]; then
+ usage
+ exit 1
+ fi
+else
+ if [ "x${DOCKER_IMAGE_ID}" == "x" ]; then
+ :
+ else
+ echo "You must not supply both an ID and a name."
+ exit 1
+ fi
+ DOCKER_IMAGE_ID=$(docker ps -f name=${DOCKER_IMAGE_NAME} -q)
+ [ "x${DOCKER_IMAGE_ID}" == "x" ] && \
+ die "failed to find a docker image named ${DOCKER_IMAGE_NAME}"
+fi
+
+if [ ${ALLOCATE_TTY} == 1 ]; then
+ docker exec -it "${DOCKER_IMAGE_ID}" "${@}" ${RUN_COMMAND}
+else
+ docker exec -i "${DOCKER_IMAGE_ID}" "${@}" ${RUN_COMMAND} &
+ wait
+fi