Created
August 3, 2018 11:32
-
-
Save denis-itskovich/e6eb9ac811b031e9aff9a7d992afe072 to your computer and use it in GitHub Desktop.
Docker container upgrade script
This file contains 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
#!/bin/bash | |
base=`basename $0` | |
get_image() { | |
docker inspect --format='{{.Config.Image}}' $1 | |
} | |
get_name() { | |
NAME=`docker inspect --format='{{.Name}}' $1` | |
echo ${NAME:1} | |
} | |
show_run_cmd() { | |
NET_ARGS=`docker inspect --format='--net {{range $h, $conf := .NetworkSettings.Networks}}{{$h}}{{end}}' $1` | |
PORT_ARGS=`docker inspect --format='{{range $p, $conf := .NetworkSettings.Ports}}-p {{(index $conf 0).HostPort}}:{{$p}} {{end}}' $1` | |
IMAGE=`get_image $1` | |
VOLUME_ARGS=`docker inspect --format='{{range $conf := .HostConfig.Binds}}-v {{$conf}} {{end}}' $1` | |
CAPP_ADD_ARGS=`docker inspect --format='{{range $conf := .HostConfig.CapAdd}}--cap-add {{$conf}} {{end}}' $1` | |
CAPP_DROP_ARGS=`docker inspect --format='{{range $conf := .HostConfig.CapDrop}}--cap-drop {{$conf}} {{end}}' $1` | |
CAPP_ARGS=$CAPP_ADD_ARGS $CAPP_DROP_ARGS | |
NAME_ARGS="--name `get_name $1`" | |
RESTART_ARGS=`docker inspect --format='--restart {{.HostConfig.RestartPolicy.Name}}' $1` | |
RUN_ARGS="-d $NAME_ARGS $RESTART_ARGS $NET_ARGS $PORT_ARGS $VOLUME_ARGS $CAPP_ARGS" | |
echo docker run $RUN_ARGS $IMAGE | |
} | |
upgrade_containers() { | |
for n in $(docker ps --format='{{.ID}}'); do | |
RUN_CMD=`show_run_cmd $n` | |
NAME=`get_name $n` | |
IMAGE=`get_image $n` | |
printf "Stopping $NAME..."; docker stop $n | |
printf "Removing $NAME..."; docker rm $n | |
printf "Pulling $IMAGE:latest"; docker pull $IMAGE:latest | |
printf "Running $NAME..."; $RUN_CMD | |
done | |
} | |
generate_script() { | |
CREATE_SCRIPT=${1:-create_containers.sh} | |
echo Generating $CREATE_SCRIPT... | |
[ -f $CREATE_SCRIPT ] && mv $CREATE_SCRIPT $CREATE_SCRIPT.bak | |
printf "#!/bin/bash\n\n" > $CREATE_SCRIPT | |
for n in $(docker ps --format='{{.ID}}'); do | |
RUN_CMD=`show_run_cmd $n` | |
NAME=`get_name $n` | |
printf "# Creating $NAME container\n$RUN_CMD\n\n" >> $CREATE_SCRIPT | |
done | |
} | |
show_help() { | |
echo "Usage: $base <command> [args]" | |
echo "Commands:" | |
echo " --help Shows this help" | |
echo " generate [filename] Generates container creation script" | |
echo " upgrade Upgrades all running containers" | |
} | |
if [ $# -eq 0 ]; then | |
show_help | |
fi | |
while [ $# -gt 0 ]; | |
do | |
case $1 in | |
"--help") | |
show_help | |
;; | |
"generate") | |
shift | |
generate_script $1 | |
;; | |
"upgrade") | |
upgrade_containers | |
;; | |
*) | |
show_help | |
;; | |
esac | |
shift | |
done |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment