#!/bin/bash ## Set NO_DOCKER_RESTART to prevent restarting docker after upgrade. ## Set ALLOW_DOCKER_CHANGE to allow change your docker version. ## Set TARGET_DOCKER_VERSION to force a version (use cautiously!) distro=$(lsb_release -is) release=$(lsb_release -rs) if [ -z "$TARGET_DOCKER_VERSION" ]; then case "$distro" in Debian) case "$release" in 10|11|12) target_version=24;; *) target_version=19;; esac ;; Ubuntu) case "$release" in 22.04) target_version=24;; *) target_version=19;; esac ;; *) target_version=17;; esac else target_version="$TARGET_DOCKER_VERSION" fi just_installed= if ! type -p docker >/dev/null; then echo "Installing docker..." type -p curl >/dev/null || apt-get install -y curl &2 echo " client: $docker_client_version" >&2 echo " server: $docker_server_version" >&2 mismatch_client_server=1 fi distrib_available_version="$(apt-cache madison docker-ce | cut -f 2 -d \| | grep "$target_version" | head -n 1 | xargs echo)" cleaned_distrib_available_version="${distrib_available_version%%~*}" cleaned_distrib_available_version="${distrib_available_version%-*}" cleaned_distrib_available_version="${cleaned_distrib_available_version#*:}" if [ -z "$mismatch_client_server" ] && [[ "$docker_client_version" == "$cleaned_distrib_available_version" ]]; then ## current and target versions match, no upgrade needed echo "INFO: recommended target docker version $docker_client_version already installed" >&2 echo " To set a different target version, set TARGET_DOCKER_VERSION" >&2 exit 0 fi ## Should we skip upgrade? if [ -z "$just_installed" ] && [ -z "$ALLOW_DOCKER_CHANGE" ]; then if [ -n "$distrib_available_version" ]; then if [ -z "$mismatch_client_server" ]; then ## get current version for docker-ce debian package installed current_debian_package_version="$(dpkg -s docker-ce | grep '^Version:' | cut -f 2 -d ' ')" echo "INFO: docker recommended version available (current: $current_debian_package_version => recommended: $distrib_available_version)" >&2 else current_docker_ce_package_version="$(dpkg -s docker-ce | grep '^Version:' | cut -f 2 -d ' ')" current_docker_ce_cli_package_version="$(dpkg -s docker-ce-cli | grep '^Version:' | cut -f 2 -d ' ')" echo "WARNING: docker recommended version available (recommended: $distrib_available_version)" >&2 echo " And your client ($current_docker_ce_cli_package_version) and server ($current_docker_ce_package_version) versions differ." >&2 fi echo " To change version, run this script with ALLOW_DOCKER_CHANGE=1" >&2 else echo "WARNING: your docker version does match target recommended version" >&2 echo " And your distribution does not package target version." >&2 echo " - Your distribution: $distro $release" >&2 echo " - Current docker version: $docker_client_version" >&2 echo " - Target recommended version: ${target_version}*" >&2 fi exit 0 fi if [ -z "$distrib_available_version" ]; then echo "ERROR: no docker version matching '${target_version}*' available for your distribution" >&2 echo " Your distribution: $distro $release" >&2 echo " Available versions:" >&2 apt-cache madison docker-ce | cut -f 2 -d \| | sed -r 's/^/ -/g' >&2 echo echo " 1) You may need to contact your system administrator to upgrade this script." >&2 echo " 2) Meanwhile, if you know what you are doing, you can set yourself a target version" >&2 echo " by setting TARGET_DOCKER_VERSION." >&2 exit 1 fi apt-get install -y --allow-downgrades \ docker-ce="$distrib_available_version" \ docker-ce-cli="$distrib_available_version"