You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

113 lines
4.5 KiB

#!/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 </dev/null
curl -sSL https://get.docker.io | sh || exit 1
just_installed=1
fi
read docker_client_version docker_server_version < <(
docker version --format '{{.Client.Version}} {{.Server.Version}}'
)
mismatch_client_server=
## issue a warning if client and server versions are different
if [ "$docker_client_version" != "$docker_server_version" ]; then
echo "WARNING: docker client and server versions differ!" >&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" </dev/null &&
if [ -z "$NO_DOCKER_RESTART" ]; then
systemctl daemon-reload &&
service docker restart
fi