#!/bin/sh # Copyright 2020 Docker Compose CLI authors # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Script to install the Docker ACI integration CLI on Ubuntu (Beta). set -eu CLI_VERSION=${CLI_VERSION:-0.1.4} DOWNLOAD_URL="${DOWNLOAD_URL:-https://github.com/docker/aci-integration-beta/releases/download/v${CLI_VERSION}/docker-linux-amd64}" LINK_NAME="${LINK_NAME:-com.docker.cli}" DRY_RUN="${DRY_RUN:-}" desktop_install_url="https://www.docker.com/products/docker-desktop" engine_install_url="https://docs.docker.com/get-docker/" link_path="/usr/local/bin/${LINK_NAME}" existing_cli_path="/usr/bin/docker" manual_install() { echo "Please follow the manual install instructions" } is_new_cli() { azure_version_str="$($1 version 2>/dev/null | grep 'Azure' || true)" if [ -n "$azure_version_str" ]; then echo 1 else echo 0 fi } echo "Running checks..." # Check OS if [ "$(command -v uname)" ]; then case "$(uname -s)" in "Linux") # Check for Ubuntu/Debian based distro if ! [ -f "/etc/lsb-release" ]; then echo "Warning: This script has been tested on Ubuntu and may not work on other distributions" fi # Pass ;; "Darwin") echo "Error: Script not needed on macOS, please install Docker Desktop Edge: $desktop_install_url" exit 1 ;; "*") echo "Error: Unsupported OS, please follow manual instructions" exit 1 ;; esac else # Assume Windows echo "Error: Script not needed on Windows, please install Docker Desktop Edge: $desktop_install_url" exit 1 fi user="$(id -un 2>/dev/null || true)" sh_c='sh -c' sudo_sh_c='sh -c' if [ "$user" != 'root' ]; then if [ "$(command -v sudo)" ]; then sudo_sh_c='sudo -E sh -c' elif [ "$(command -v su)" ]; then sudo_sh_c='su -c' else echo "Error: This installer needs the ability to run commands as root." exit 1 fi fi if [ -n "$DRY_RUN" ]; then sh_c="echo $sh_c" sudo_sh_c="echo $sudo_sh_c" fi # Check if Docker Engine is installed if ! [ "$(command -v docker)" ]; then echo "Error: Docker Engine not found" echo "You need to install Docker first: $engine_install_url" exit 1 fi # Check if the ACI CLI is already installed if [ $(is_new_cli "docker") -eq 1 ]; then echo "You already have the Docker ACI Integration CLI installed" exit 1 fi # Check if this script has already been run if [ -f "${link_path}" ]; then echo "Error: This script appears to have been run as ${link_path} exists" echo "Please uninstall and rerun this script or follow the manual instructions" exit 1 fi # Check current Docker CLI is installed to /usr/bin/ if ! [ -f "${existing_cli_path}" ]; then echo "Error: This script only works if the Docker CLI is installed to /usr/bin/" manual_install exit 1 fi # Check that PATH contains /usr/bin and /usr/local/bin and that the latter is # higher priority path_directories=$(echo "${PATH}" | tr ":" "\n") usr_bin_pos=-1 usr_local_bin_pos=-1 count=0 for d in ${path_directories}; do if [ "${d}" = '/usr/bin' ]; then usr_bin_pos=$count fi if [ "${d}" = '/usr/local/bin' ]; then usr_local_bin_pos=$count fi count=$((count + 1)) done if [ $usr_bin_pos -eq -1 ]; then echo "Error: /usr/bin not found in PATH" manual_install exit 1 elif [ $usr_local_bin_pos -eq -1 ]; then echo "Error: /usr/local/bin not found in PATH" manual_install exit 1 elif ! [ $usr_local_bin_pos -lt $usr_bin_pos ]; then echo "Error: /usr/local/bin is not ordered higher than /usr/bin in your PATH" manual_install exit 1 fi download_cmd='curl -fsSLo' # Check that system has curl installed if ! [ "$(command -v curl)" ]; then echo "Error: curl not found" echo "Please install curl" exit 1 fi echo "Checks passed!" echo "Downloading CLI..." # Download CLI to temporary directory download_dir=$($sh_c 'mktemp -d') $sh_c "${download_cmd} ${download_dir}/docker-aci ${DOWNLOAD_URL}" echo "Downloaded CLI!" echo "Installing CLI..." # Link existing Docker CLI $sudo_sh_c "ln -s ${existing_cli_path} ${link_path}" # Install downloaded CLI $sudo_sh_c "install -m 775 ${download_dir}/docker-aci /usr/local/bin/docker" # Exit on dry run if [ -n "$DRY_RUN" ]; then exit 0 fi # Clear cache cleared_cache=1 if [ "$(command hash)" ]; then $sh_c "hash -r" elif [ "$(command rehash)" ]; then $sh_c "rehash" else cleared_cache= echo "Warning: Unable to clear command cache" fi if [ -n "$cleared_cache" ]; then # Check ACI CLI is working if [ $(is_new_cli "docker") -eq 0 ]; then echo "Error: Docker ACI Integration CLI installation error" exit 1 fi echo "Done!" else echo "Please log out and in again to use the Docker ACI integration CLI" fi