docker.sh: a small interactive shell hack for docker
Usage: ./docker.sh [base-image-name]
docker.sh: a small interactive shell hack for docker
Usage: ./docker.sh [base-image-name]
#!/bin/bash | |
DEBUG=${DEBUG:+-x} | |
export IMG=${1:-ubuntu} | |
DOCKERRC=$(dirname $0)/dockerrc | |
bash --rcfile ${DOCKERRC} ${DEBUG} |
shopt -s extdebug | |
alias docker=lxc-docker | |
DIRTY="*" | |
CLEAN="" | |
STATE=${CLEAN} | |
PS1="docker@\${REPO}:\${IMG}!\${ID}\${STATE}> " | |
dockerenv() | |
{ | |
CMD=$(history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//g") | |
set ${CMD} | |
case "$1" in | |
!*) | |
shift | |
eval $@ | |
;; | |
from) | |
IMG=$(docker images -q=true $2 | head -n 1) | |
IMG=${IMG:-$2} | |
;; | |
to) | |
REPO=$2 | |
;; | |
pop) | |
LAST=$(docker history "${IMG}" | sed -n 3p) | |
echo rewinding to ${LAST} | |
IMG=$(echo "${LAST}" | cut -d' ' -f1 | cut -d':' -f1) | |
STATE=${DIRTY} | |
;; | |
put) | |
echo commiting $(docker ps -l | sed -n 2p) | |
IMG=$(docker commit "${ID}" ${REPO:-$2}) | |
REPO=${2:-${REPO}} | |
STATE=${CLEAN} | |
;; | |
h) | |
docker history "${IMG}" | |
;; | |
enter) | |
docker run -i -t "${IMG}" bash | |
ID=$(docker ps -l -q) | |
;; | |
help) | |
docker ${CMD} | |
echo "Shortcuts:" | |
echo " from <img> Set current image." | |
echo " to <repo> Set destination repo." | |
echo " put [repo] Commit last command to a new image." | |
echo " pop Go back to previous image." | |
echo " h Print current image history." | |
echo " enter Execute an interactive shell in the container." | |
;; | |
*) | |
docker help $1 2>&1 | grep "Command not found" > /dev/null | |
if [ $? -eq 0 ] | |
then | |
docker run "${IMG}" $(eval echo ${CMD}) | |
ID=$(docker ps -l -q) | |
STATE=${DIRTY} | |
else | |
docker $(eval echo ${CMD}) | |
fi | |
;; | |
esac | |
return 1 | |
} | |
trap dockerenv DEBUG |
Thank you very much for this script, seems like a very handy tool to build docker files while still experimenting