Skip to content

Instantly share code, notes, and snippets.

@denis-itskovich
Created August 3, 2018 11:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save denis-itskovich/e6eb9ac811b031e9aff9a7d992afe072 to your computer and use it in GitHub Desktop.
Save denis-itskovich/e6eb9ac811b031e9aff9a7d992afe072 to your computer and use it in GitHub Desktop.
Docker container upgrade script
#!/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