微服务探索之路01篇.net6.0项目本地win10系统docker到服务器liunx系统docker的贯通

本文介绍从创建 net6.0 项目运行在 windows 开发环境的 docker 然后正式部署至 liunx 服务器。

1 windows10 安装 docker

  • 下载docker-desktop
  • 双击下载后的文件直接安装一直下一步到安装成功
  • 打开 docker, 点击设置找到 Docker Engine 设置国内镜像

国内镜像地址可以在阿里云找到, 阿里云镜像加速器登录之后可以看到一个加速地址, 复制出来加入设置 docker 的配置就可以

图片里的配置 json 如下:
{ "builder": { "gc": { "defaultKeepStorage": "20GB", "enabled": true } }, "debug": false, "experimental": false, "features": { "buildkit": true }, "insecure-registries": [], "registry-mirrors": [ "加速器地址" ] }

2 用 vs2022 创建一个简单的 net6.0 项目

  • 创建项目的时候选择启用 docker,

创建完之后可以发现项目多了一个 Dockerfile 文件(文件属性改为较新则复制, 不然发布之后这个文件不会在目录里), 修改文件相关内容如下图, 避免运行时出错

图上内容最终结果为:

FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base

WORKDIR /app

EXPOSE 3100

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build

WORKDIR /src

COPY . .

ENV ASPNETCORE_URLS=http://+:3100

ENTRYPOINT ["dotnet", "WebApplication1.dll"]

  • 发布项目至文件夹, 发布完成之后文件都在 bin\Release\net6.0\publish 下面
  • 打开命令窗口, 切换至发布目录下, 执行 docker buid 生成镜像

    注意最后的空格和点是必须的
  • 执行完之后打开 docker 界面可以看到生成的镜像如下图:
  • 执行 docker run 运行镜像!

    执行后打开 docker 界面切到容器运行可以看到运行起来的容器
  • 打开浏览器访问 http://127.0.0.1:3100/weatherforecast 出现界面结果表示成功,weatherforecast 这个表示这个项目的路由如果你的项目是其他路由那就写其他的路由不是固定的

3 将镜像推送至 dockerhub

1. 打开 docker 界面登录账号 (如果没账号请先注册)

2. 要上传至镜像仓库需要打上标签, 才可以上传, 执行标签命令docker tag 镜像名:版本号 dockerhub注册时候填的ID/镜像名:版本号

3. 找到打了标签的镜像 push

4. 等到进度条走完, 可以登录 https://hub.docker.com 查看提交的镜像

4 使用 daocloud 集群部署镜像到 liunx 服务器 (daocloud 已经不能使用 2022-6-16 记录)

1. 在 liunx 服务器安装 docker 安装资源比较慢所以使用 daocloud 的加速镜像安装执行以下命令就可以

curl -sSL https://get.daocloud.io/docker | sh

2. 登录daocloud添加服务器主机, 方法在登录有一串命令复制到服务器执行就可以关联
3. 关联之后找到上一步上传的镜像打开镜像进行部署

4. 点击部署出现如下界面进行配置


5. 部署完之后查看状态是否正常

6. 用 nginx 反向代理绑定域名访问指向这个端口 (自行百度如何用 nginx)

5 liunx 部署 docker 执行下面命令

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

以上文件内容,(记录防止跟 daocloud 一样访问不了,访问不了的时候可以直接修改下面的内容自己做一个脚本):

#!/bin/sh
set -e
# Docker CE for Linux installation script
#
# See https://docs.docker.com/engine/install/ for the installation steps.
#
# This script is meant for quick & easy install via:
#   $ curl -fsSL https://get.docker.com -o get-docker.sh
#   $ sh get-docker.sh
#
# For test builds (ie. release candidates):
#   $ curl -fsSL https://test.docker.com -o test-docker.sh
#   $ sh test-docker.sh
#
# NOTE: Make sure to verify the contents of the script
#       you downloaded matches the contents of install.sh
#       located at https://github.com/docker/docker-install
#       before executing.
#
# Git commit from https://github.com/docker/docker-install when
# the script was uploaded (Should only be modified by upload job):
SCRIPT_COMMIT_SHA="b2e29ef7a9a89840d2333637f7d1900a83e7153f"

# strip "v" prefix if present
VERSION="${VERSION#v}"

# The channel to install from:
# * nightly
# * test
# * stable
# * edge (deprecated)
DEFAULT_CHANNEL_VALUE="stable"
if [ -z "$CHANNEL" ]; then
CHANNEL=$DEFAULT_CHANNEL_VALUE
fi

DEFAULT_DOWNLOAD_URL="https://download.docker.com"
if [ -z "$DOWNLOAD_URL" ]; then
DOWNLOAD_URL=$DEFAULT_DOWNLOAD_URL
fi

DEFAULT_REPO_FILE="docker-ce.repo"
if [ -z "$REPO_FILE" ]; then
REPO_FILE="$DEFAULT_REPO_FILE"
fi

mirror=''
DRY_RUN=${DRY_RUN:-}
while [ $# -gt 0 ]; do
case "$1" in
--mirror)
mirror="$2"
shift
;;
--dry-run)
DRY_RUN=1
;;
--*)
echo "Illegal option $1"
;;
esac
shift $(( $# > 0 ? 1 : 0 ))
done

case "$mirror" in
Aliyun)
DOWNLOAD_URL="https://mirrors.aliyun.com/docker-ce"
;;
AzureChinaCloud)
DOWNLOAD_URL="https://mirror.azure.cn/docker-ce"
;;
esac

command_exists() {
command -v "$@" > /dev/null 2>&1
}

# version_gte checks if the version specified in $VERSION is at least
# the given CalVer (YY.MM) version. returns 0 (success) if $VERSION is either
# unset (=latest) or newer or equal than the specified version. Returns 1 (fail)
# otherwise.
#
# examples:
#
# VERSION=20.10
# version_gte 20.10 // 0 (success)
# version_gte 19.03 // 0 (success)
# version_gte 21.10 // 1 (fail)
version_gte() {
if [ -z "$VERSION" ]; then
return 0
fi
eval calver_compare "$VERSION" "$1"
}

# calver_compare compares two CalVer (YY.MM) version strings. returns 0 (success)
# if version A is newer or equal than version B, or 1 (fail) otherwise. Patch
# releases and pre-release (-alpha/-beta) are not taken into account
#
# examples:
#
# calver_compare 20.10 19.03 // 0 (success)
# calver_compare 20.10 20.10 // 0 (success)
# calver_compare 19.03 20.10 // 1 (fail)
calver_compare() (
set +x

yy_a=<span class="hljs-string">"<span class="hljs-subst">$(echo <span class="hljs-string">"<span class="hljs-variable">$1</span>"</span> | cut -d'.' -f1)</span>"</span>
yy_b=<span class="hljs-string">"<span class="hljs-subst">$(echo <span class="hljs-string">"<span class="hljs-variable">$2</span>"</span> | cut -d'.' -f1)</span>"</span>
<span class="hljs-keyword">if</span> [ <span class="hljs-string">"<span class="hljs-variable">$yy_a</span>"</span> -lt <span class="hljs-string">"<span class="hljs-variable">$yy_b</span>"</span> ]; <span class="hljs-keyword">then</span>
	<span class="hljs-built_in">return</span> 1
<span class="hljs-keyword">fi</span>
<span class="hljs-keyword">if</span> [ <span class="hljs-string">"<span class="hljs-variable">$yy_a</span>"</span> -gt <span class="hljs-string">"<span class="hljs-variable">$yy_b</span>"</span> ]; <span class="hljs-keyword">then</span>
	<span class="hljs-built_in">return</span> 0
<span class="hljs-keyword">fi</span>
mm_a=<span class="hljs-string">"<span class="hljs-subst">$(echo <span class="hljs-string">"<span class="hljs-variable">$1</span>"</span> | cut -d'.' -f2)</span>"</span>
mm_b=<span class="hljs-string">"<span class="hljs-subst">$(echo <span class="hljs-string">"<span class="hljs-variable">$2</span>"</span> | cut -d'.' -f2)</span>"</span>
<span class="hljs-keyword">if</span> [ <span class="hljs-string">"<span class="hljs-variable">${mm_a#0}</span>"</span> -lt <span class="hljs-string">"<span class="hljs-variable">${mm_b#0}</span>"</span> ]; <span class="hljs-keyword">then</span>
	<span class="hljs-built_in">return</span> 1
<span class="hljs-keyword">fi</span>

<span class="hljs-built_in">return</span> 0

)

is_dry_run() {
if [ -z "$DRY_RUN" ]; then
return 1
else
return 0
fi
}

is_wsl() {
case "$(uname -r)" in
microsoft ) true ;; # WSL 2
Microsoft ) true ;; # WSL 1
* ) false;;
esac
}

is_darwin() {
case "$(uname -s)" in
darwin ) true ;;
Darwin ) true ;;
* ) false;;
esac
}

deprecation_notice() {
distro=$1
distro_version=$2
echo
printf "\033[91;1mDEPRECATION WARNING\033[0m\n"
printf "This Linux distribution (\033[1m%s %s\033[0m) reached end-of-life and is no longer supported by this script.\n" "$distro" "$distro_version"
echo "No updates or security fixes will be released for this distribution, and users are recommended"
echo " to upgrade to a currently maintained version of $distro."
echo
printf "Press \033[1mCtrl+C\033[0m now to abort this script, or wait for the installation to continue."
echo
sleep 10
}

get_distribution() {
lsb_dist=""
# Every system that we officially support has /etc/os-release
if [-r /etc/os-release]; then
lsb_dist="$(. /etc/os-release && echo "$ID")"
fi
# Returning an empty string here should be alright since the
# case statements don't act unless you provide an actual value
echo "$lsb_dist"
}

echo_docker_as_nonroot() {
if is_dry_run; then
return
fi
if command_exists docker && [-e /var/run/docker.sock]; then
(
set -x
$sh_c 'docker version'
) || true
fi

<span class="hljs-comment"># intentionally mixed spaces and tabs here -- tabs are stripped by "&lt;&lt;-EOF", spaces are kept in the output</span>
<span class="hljs-built_in">echo</span>
<span class="hljs-built_in">echo</span> <span class="hljs-string">"================================================================================"</span>
<span class="hljs-built_in">echo</span>
<span class="hljs-keyword">if</span> version_gte <span class="hljs-string">"20.10"</span>; <span class="hljs-keyword">then</span>
	<span class="hljs-built_in">echo</span> <span class="hljs-string">"To run Docker as a non-privileged user, consider setting up the"</span>
	<span class="hljs-built_in">echo</span> <span class="hljs-string">"Docker daemon in rootless mode for your user:"</span>
	<span class="hljs-built_in">echo</span>
	<span class="hljs-built_in">echo</span> <span class="hljs-string">"    dockerd-rootless-setuptool.sh install"</span>
	<span class="hljs-built_in">echo</span>
	<span class="hljs-built_in">echo</span> <span class="hljs-string">"Visit https://docs.docker.com/go/rootless/ to learn about rootless mode."</span>
	<span class="hljs-built_in">echo</span>
<span class="hljs-keyword">fi</span>
<span class="hljs-built_in">echo</span>
<span class="hljs-built_in">echo</span> <span class="hljs-string">"To run the Docker daemon as a fully privileged service, but granting non-root"</span>
<span class="hljs-built_in">echo</span> <span class="hljs-string">"users access, refer to https://docs.docker.com/go/daemon-access/"</span>
<span class="hljs-built_in">echo</span>
<span class="hljs-built_in">echo</span> <span class="hljs-string">"WARNING: Access to the remote API on a privileged Docker daemon is equivalent"</span>
<span class="hljs-built_in">echo</span> <span class="hljs-string">"         to root access on the host. Refer to the 'Docker daemon attack surface'"</span>
<span class="hljs-built_in">echo</span> <span class="hljs-string">"         documentation for details: https://docs.docker.com/go/attack-surface/"</span>
<span class="hljs-built_in">echo</span>
<span class="hljs-built_in">echo</span> <span class="hljs-string">"================================================================================"</span>
<span class="hljs-built_in">echo</span>

}

# Check if this is a forked Linux distro
check_forked() {

<span class="hljs-comment"># Check for lsb_release command existence, it usually exists in forked distros</span>
<span class="hljs-keyword">if</span> command_exists lsb_release; <span class="hljs-keyword">then</span>
	<span class="hljs-comment"># Check if the `-u` option is supported</span>
	<span class="hljs-built_in">set</span> +e
	lsb_release -a -u &gt; /dev/null 2&gt;&amp;1
	lsb_release_exit_code=$?
	<span class="hljs-built_in">set</span> -e

	<span class="hljs-comment"># Check if the command has exited successfully, it means we're in a forked distro</span>
	<span class="hljs-keyword">if</span> [ <span class="hljs-string">"<span class="hljs-variable">$lsb_release_exit_code</span>"</span> = <span class="hljs-string">"0"</span> ]; <span class="hljs-keyword">then</span>
		<span class="hljs-comment"># Print info about current distro</span>
		<span class="hljs-built_in">cat</span> &lt;&lt;-<span class="hljs-string">EOF
		You're using '$lsb_dist' version '$dist_version'.
		EOF</span>

		<span class="hljs-comment"># Get the upstream release info</span>
		lsb_dist=$(lsb_release -a -u 2&gt;&amp;1 | <span class="hljs-built_in">tr</span> <span class="hljs-string">'[:upper:]'</span> <span class="hljs-string">'[:lower:]'</span> | grep -E <span class="hljs-string">'id'</span> | <span class="hljs-built_in">cut</span> -d <span class="hljs-string">':'</span> -f 2 | <span class="hljs-built_in">tr</span> -d <span class="hljs-string">'[:space:]'</span>)
		dist_version=$(lsb_release -a -u 2&gt;&amp;1 | <span class="hljs-built_in">tr</span> <span class="hljs-string">'[:upper:]'</span> <span class="hljs-string">'[:lower:]'</span> | grep -E <span class="hljs-string">'codename'</span> | <span class="hljs-built_in">cut</span> -d <span class="hljs-string">':'</span> -f 2 | <span class="hljs-built_in">tr</span> -d <span class="hljs-string">'[:space:]'</span>)

		<span class="hljs-comment"># Print info about upstream distro</span>
		<span class="hljs-built_in">cat</span> &lt;&lt;-<span class="hljs-string">EOF
		Upstream release is '$lsb_dist' version '$dist_version'.
		EOF</span>
	<span class="hljs-keyword">else</span>
		<span class="hljs-keyword">if</span> [ -r /etc/debian_version ] &amp;&amp; [ <span class="hljs-string">"<span class="hljs-variable">$lsb_dist</span>"</span> != <span class="hljs-string">"ubuntu"</span> ] &amp;&amp; [ <span class="hljs-string">"<span class="hljs-variable">$lsb_dist</span>"</span> != <span class="hljs-string">"raspbian"</span> ]; <span class="hljs-keyword">then</span>
			<span class="hljs-keyword">if</span> [ <span class="hljs-string">"<span class="hljs-variable">$lsb_dist</span>"</span> = <span class="hljs-string">"osmc"</span> ]; <span class="hljs-keyword">then</span>
				<span class="hljs-comment"># OSMC runs Raspbian</span>
				lsb_dist=raspbian
			<span class="hljs-keyword">else</span>
				<span class="hljs-comment"># We're Debian and don't even know it!</span>
				lsb_dist=debian
			<span class="hljs-keyword">fi</span>
			dist_version=<span class="hljs-string">"<span class="hljs-subst">$(sed 's/\/.*//' /etc/debian_version | sed 's/\..*//')</span>"</span>
			<span class="hljs-keyword">case</span> <span class="hljs-string">"<span class="hljs-variable">$dist_version</span>"</span> <span class="hljs-keyword">in</span>
				11)
					dist_version=<span class="hljs-string">"bullseye"</span>
				;;
				10)
					dist_version=<span class="hljs-string">"buster"</span>
				;;
				9)
					dist_version=<span class="hljs-string">"stretch"</span>
				;;
				8)
					dist_version=<span class="hljs-string">"jessie"</span>
				;;
			<span class="hljs-keyword">esac</span>
		<span class="hljs-keyword">fi</span>
	<span class="hljs-keyword">fi</span>
<span class="hljs-keyword">fi</span>

}

do_install() {
echo "# Executing docker install script, commit: $SCRIPT_COMMIT_SHA"

<span class="hljs-keyword">if</span> command_exists docker; <span class="hljs-keyword">then</span>
	<span class="hljs-built_in">cat</span> &gt;&amp;2 &lt;&lt;-<span class="hljs-string">'EOF'</span>
		Warning: the <span class="hljs-string">"docker"</span> <span class="hljs-built_in">command</span> appears to already exist on this system.

		If you already have Docker installed, this script can cause trouble, <span class="hljs-built_in">which</span> is
		why we<span class="hljs-string">'re displaying this warning and provide the opportunity to cancel the
		installation.

		If you installed the current Docker package using this script and are using it
		again to update Docker, you can safely ignore this message.

		You may press Ctrl+C now to abort this script.
	EOF
	( set -x; sleep 20 )
fi

user="$(id -un 2&gt;/dev/null || true)"

sh_c='</span>sh -c<span class="hljs-string">'
if [ "$user" != '</span>root<span class="hljs-string">' ]; then
	if command_exists sudo; then
		sh_c='</span>sudo -E sh -c<span class="hljs-string">'
	elif command_exists su; then
		sh_c='</span>su -c<span class="hljs-string">'
	else
		cat &gt;&amp;2 &lt;&lt;-'</span>EOF<span class="hljs-string">'
		Error: this installer needs the ability to run commands as root.
		We are unable to find either "sudo" or "su" available to make this happen.
		EOF
		exit 1
	fi
fi

if is_dry_run; then
	sh_c="echo"
fi

# perform some very rudimentary platform detection
lsb_dist=$( get_distribution )
lsb_dist="$(echo "$lsb_dist" | tr '</span>[:upper:]<span class="hljs-string">' '</span>[:lower:]<span class="hljs-string">')"

if is_wsl; then
	echo
	echo "WSL DETECTED: We recommend using Docker Desktop for Windows."
	echo "Please get Docker Desktop from https://www.docker.com/products/docker-desktop"
	echo
	cat &gt;&amp;2 &lt;&lt;-'</span>EOF<span class="hljs-string">'

		You may press Ctrl+C now to abort this script.
	EOF
	( set -x; sleep 20 )
fi

case "$lsb_dist" in

	ubuntu)
		if command_exists lsb_release; then
			dist_version="$(lsb_release --codename | cut -f2)"
		fi
		if [ -z "$dist_version" ] &amp;&amp; [ -r /etc/lsb-release ]; then
			dist_version="$(. /etc/lsb-release &amp;&amp; echo "$DISTRIB_CODENAME")"
		fi
	;;

	debian|raspbian)
		dist_version="$(sed '</span>s/\/.*//<span class="hljs-string">' /etc/debian_version | sed '</span>s/\..*//<span class="hljs-string">')"
		case "$dist_version" in
			11)
				dist_version="bullseye"
			;;
			10)
				dist_version="buster"
			;;
			9)
				dist_version="stretch"
			;;
			8)
				dist_version="jessie"
			;;
		esac
	;;

	centos|rhel|sles)
		if [ -z "$dist_version" ] &amp;&amp; [ -r /etc/os-release ]; then
			dist_version="$(. /etc/os-release &amp;&amp; echo "$VERSION_ID")"
		fi
	;;

	*)
		if command_exists lsb_release; then
			dist_version="$(lsb_release --release | cut -f2)"
		fi
		if [ -z "$dist_version" ] &amp;&amp; [ -r /etc/os-release ]; then
			dist_version="$(. /etc/os-release &amp;&amp; echo "$VERSION_ID")"
		fi
	;;

esac

# Check if this is a forked Linux distro
check_forked

# Print deprecation warnings for distro versions that recently reached EOL,
# but may still be commonly used (especially LTS versions).
case "$lsb_dist.$dist_version" in
	debian.stretch|debian.jessie)
		deprecation_notice "$lsb_dist" "$dist_version"
		;;
	raspbian.stretch|raspbian.jessie)
		deprecation_notice "$lsb_dist" "$dist_version"
		;;
	ubuntu.xenial|ubuntu.trusty)
		deprecation_notice "$lsb_dist" "$dist_version"
		;;
	fedora.*)
		if [ "$dist_version" -lt 33 ]; then
			deprecation_notice "$lsb_dist" "$dist_version"
		fi
		;;
esac

# Run setup for each distro accordingly
case "$lsb_dist" in
	ubuntu|debian|raspbian)
		pre_reqs="apt-transport-https ca-certificates curl"
		if ! command -v gpg &gt; /dev/null; then
			pre_reqs="$pre_reqs gnupg"
		fi
		apt_repo="deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] $DOWNLOAD_URL/linux/$lsb_dist $dist_version $CHANNEL"
		(
			if ! is_dry_run; then
				set -x
			fi
			$sh_c '</span>apt-get update -qq &gt;/dev/null<span class="hljs-string">'
			$sh_c "DEBIAN_FRONTEND=noninteractive apt-get install -y -qq $pre_reqs &gt;/dev/null"
			$sh_c '</span><span class="hljs-built_in">mkdir</span> -p /etc/apt/keyrings &amp;&amp; <span class="hljs-built_in">chmod</span> -R 0755 /etc/apt/keyrings<span class="hljs-string">'
			$sh_c "curl -fsSL \"$DOWNLOAD_URL/linux/$lsb_dist/gpg\" | gpg --dearmor --yes -o /etc/apt/keyrings/docker.gpg"
			$sh_c "chmod a+r /etc/apt/keyrings/docker.gpg"
			$sh_c "echo \"$apt_repo\" &gt; /etc/apt/sources.list.d/docker.list"
			$sh_c '</span>apt-get update -qq &gt;/dev/null<span class="hljs-string">'
		)
		pkg_version=""
		if [ -n "$VERSION" ]; then
			if is_dry_run; then
				echo "# WARNING: VERSION pinning is not supported in DRY_RUN"
			else
				# Will work for incomplete versions IE (17.12), but may not actually grab the "latest" if in the test channel
				pkg_pattern="$(echo "$VERSION" | sed "s/-ce-/~ce~.*/g" | sed "s/-/.*/g").*-0~$lsb_dist"
				search_command="apt-cache madison '</span>docker-ce<span class="hljs-string">' | grep '</span><span class="hljs-variable">$pkg_pattern</span><span class="hljs-string">' | head -1 | awk '</span>{\<span class="hljs-variable">$1</span>=\<span class="hljs-variable">$1</span>};1<span class="hljs-string">' | cut -d'</span> <span class="hljs-string">' -f 3"
				pkg_version="$($sh_c "$search_command")"
				echo "INFO: Searching repository for VERSION '</span><span class="hljs-variable">$VERSION</span><span class="hljs-string">'"
				echo "INFO: $search_command"
				if [ -z "$pkg_version" ]; then
					echo
					echo "ERROR: '</span><span class="hljs-variable">$VERSION</span><span class="hljs-string">' not found amongst apt-cache madison results"
					echo
					exit 1
				fi
				if version_gte "18.09"; then
						search_command="apt-cache madison '</span>docker-ce-cli<span class="hljs-string">' | grep '</span><span class="hljs-variable">$pkg_pattern</span><span class="hljs-string">' | head -1 | awk '</span>{\<span class="hljs-variable">$1</span>=\<span class="hljs-variable">$1</span>};1<span class="hljs-string">' | cut -d'</span> <span class="hljs-string">' -f 3"
						echo "INFO: $search_command"
						cli_pkg_version="=$($sh_c "$search_command")"
				fi
				pkg_version="=$pkg_version"
			fi
		fi
		(
			pkgs="docker-ce${pkg_version%=}"
			if version_gte "18.09"; then
					# older versions didn'</span>t ship the cli and containerd as separate packages
					pkgs=<span class="hljs-string">"<span class="hljs-variable">$pkgs</span> docker-ce-cli<span class="hljs-variable">${cli_pkg_version%=}</span> containerd.io"</span>
			<span class="hljs-keyword">fi</span>
			<span class="hljs-keyword">if</span> version_gte <span class="hljs-string">"20.10"</span>; <span class="hljs-keyword">then</span>
					pkgs=<span class="hljs-string">"<span class="hljs-variable">$pkgs</span> docker-compose-plugin"</span>
			<span class="hljs-keyword">fi</span>
			<span class="hljs-keyword">if</span> version_gte <span class="hljs-string">"20.10"</span> &amp;&amp; [ <span class="hljs-string">"<span class="hljs-subst">$(uname -m)</span>"</span> = <span class="hljs-string">"x86_64"</span> ]; <span class="hljs-keyword">then</span>
					<span class="hljs-comment"># also install the latest version of the "docker scan" cli-plugin (only supported on x86 currently)</span>
					pkgs=<span class="hljs-string">"<span class="hljs-variable">$pkgs</span> docker-scan-plugin"</span>
			<span class="hljs-keyword">fi</span>
			<span class="hljs-comment"># TODO(thaJeztah) remove the $CHANNEL check once 22.06 and docker-buildx-plugin is published to the "stable" channel</span>
			<span class="hljs-keyword">if</span> [ <span class="hljs-string">"<span class="hljs-variable">$CHANNEL</span>"</span> = <span class="hljs-string">"test"</span> ] &amp;&amp; version_gte <span class="hljs-string">"22.06"</span>; <span class="hljs-keyword">then</span>
					pkgs=<span class="hljs-string">"<span class="hljs-variable">$pkgs</span> docker-buildx-plugin"</span>
			<span class="hljs-keyword">fi</span>
			<span class="hljs-keyword">if</span> ! is_dry_run; <span class="hljs-keyword">then</span>
				<span class="hljs-built_in">set</span> -x
			<span class="hljs-keyword">fi</span>
			<span class="hljs-variable">$sh_c</span> <span class="hljs-string">"DEBIAN_FRONTEND=noninteractive apt-get install -y -qq --no-install-recommends <span class="hljs-variable">$pkgs</span> &gt;/dev/null"</span>
			<span class="hljs-keyword">if</span> version_gte <span class="hljs-string">"20.10"</span>; <span class="hljs-keyword">then</span>
				<span class="hljs-comment"># Install docker-ce-rootless-extras without "--no-install-recommends", so as to install slirp4netns when available</span>
				<span class="hljs-variable">$sh_c</span> <span class="hljs-string">"DEBIAN_FRONTEND=noninteractive apt-get install -y -qq docker-ce-rootless-extras<span class="hljs-variable">${pkg_version%=}</span> &gt;/dev/null"</span>
			<span class="hljs-keyword">fi</span>
		)
		echo_docker_as_nonroot
		<span class="hljs-built_in">exit</span> 0
		;;
	centos|fedora|rhel)
		<span class="hljs-keyword">if</span> [ <span class="hljs-string">"<span class="hljs-subst">$(uname -m)</span>"</span> != <span class="hljs-string">"s390x"</span> ] &amp;&amp; [ <span class="hljs-string">"<span class="hljs-variable">$lsb_dist</span>"</span> = <span class="hljs-string">"rhel"</span> ]; <span class="hljs-keyword">then</span>
			<span class="hljs-built_in">echo</span> <span class="hljs-string">"Packages for RHEL are currently only available for s390x."</span>
			<span class="hljs-built_in">exit</span> 1
		<span class="hljs-keyword">fi</span>
		yum_repo=<span class="hljs-string">"<span class="hljs-variable">$DOWNLOAD_URL</span>/linux/<span class="hljs-variable">$lsb_dist</span>/<span class="hljs-variable">$REPO_FILE</span>"</span>
		<span class="hljs-keyword">if</span> ! curl -Ifs <span class="hljs-string">"<span class="hljs-variable">$yum_repo</span>"</span> &gt; /dev/null; <span class="hljs-keyword">then</span>
			<span class="hljs-built_in">echo</span> <span class="hljs-string">"Error: Unable to curl repository file <span class="hljs-variable">$yum_repo</span>, is it valid?"</span>
			<span class="hljs-built_in">exit</span> 1
		<span class="hljs-keyword">fi</span>
		<span class="hljs-keyword">if</span> [ <span class="hljs-string">"<span class="hljs-variable">$lsb_dist</span>"</span> = <span class="hljs-string">"fedora"</span> ]; <span class="hljs-keyword">then</span>
			pkg_manager=<span class="hljs-string">"dnf"</span>
			config_manager=<span class="hljs-string">"dnf config-manager"</span>
			enable_channel_flag=<span class="hljs-string">"--set-enabled"</span>
			disable_channel_flag=<span class="hljs-string">"--set-disabled"</span>
			pre_reqs=<span class="hljs-string">"dnf-plugins-core"</span>
			pkg_suffix=<span class="hljs-string">"fc<span class="hljs-variable">$dist_version</span>"</span>
		<span class="hljs-keyword">else</span>
			pkg_manager=<span class="hljs-string">"yum"</span>
			config_manager=<span class="hljs-string">"yum-config-manager"</span>
			enable_channel_flag=<span class="hljs-string">"--enable"</span>
			disable_channel_flag=<span class="hljs-string">"--disable"</span>
			pre_reqs=<span class="hljs-string">"yum-utils"</span>
			pkg_suffix=<span class="hljs-string">"el"</span>
		<span class="hljs-keyword">fi</span>
		(
			<span class="hljs-keyword">if</span> ! is_dry_run; <span class="hljs-keyword">then</span>
				<span class="hljs-built_in">set</span> -x
			<span class="hljs-keyword">fi</span>
			<span class="hljs-variable">$sh_c</span> <span class="hljs-string">"<span class="hljs-variable">$pkg_manager</span> install -y -q <span class="hljs-variable">$pre_reqs</span>"</span>
			<span class="hljs-variable">$sh_c</span> <span class="hljs-string">"<span class="hljs-variable">$config_manager</span> --add-repo <span class="hljs-variable">$yum_repo</span>"</span>

			<span class="hljs-keyword">if</span> [ <span class="hljs-string">"<span class="hljs-variable">$CHANNEL</span>"</span> != <span class="hljs-string">"stable"</span> ]; <span class="hljs-keyword">then</span>
				<span class="hljs-variable">$sh_c</span> <span class="hljs-string">"<span class="hljs-variable">$config_manager</span> <span class="hljs-variable">$disable_channel_flag</span> docker-ce-*"</span>
				<span class="hljs-variable">$sh_c</span> <span class="hljs-string">"<span class="hljs-variable">$config_manager</span> <span class="hljs-variable">$enable_channel_flag</span> docker-ce-<span class="hljs-variable">$CHANNEL</span>"</span>
			<span class="hljs-keyword">fi</span>
			<span class="hljs-variable">$sh_c</span> <span class="hljs-string">"<span class="hljs-variable">$pkg_manager</span> makecache"</span>
		)
		pkg_version=<span class="hljs-string">""</span>
		<span class="hljs-keyword">if</span> [ -n <span class="hljs-string">"<span class="hljs-variable">$VERSION</span>"</span> ]; <span class="hljs-keyword">then</span>
			<span class="hljs-keyword">if</span> is_dry_run; <span class="hljs-keyword">then</span>
				<span class="hljs-built_in">echo</span> <span class="hljs-string">"# WARNING: VERSION pinning is not supported in DRY_RUN"</span>
			<span class="hljs-keyword">else</span>
				pkg_pattern=<span class="hljs-string">"<span class="hljs-subst">$(echo <span class="hljs-string">"<span class="hljs-variable">$VERSION</span>"</span> | sed <span class="hljs-string">"s/-ce-/\\\\.ce.*/g"</span> | sed <span class="hljs-string">"s/-/.*/g"</span>)</span>.*<span class="hljs-variable">$pkg_suffix</span>"</span>
				search_command=<span class="hljs-string">"<span class="hljs-variable">$pkg_manager</span> list --showduplicates 'docker-ce' | grep '<span class="hljs-variable">$pkg_pattern</span>' | tail -1 | awk '{print \$2}'"</span>
				pkg_version=<span class="hljs-string">"<span class="hljs-subst">$($sh_c <span class="hljs-string">"<span class="hljs-variable">$search_command</span>"</span>)</span>"</span>
				<span class="hljs-built_in">echo</span> <span class="hljs-string">"INFO: Searching repository for VERSION '<span class="hljs-variable">$VERSION</span>'"</span>
				<span class="hljs-built_in">echo</span> <span class="hljs-string">"INFO: <span class="hljs-variable">$search_command</span>"</span>
				<span class="hljs-keyword">if</span> [ -z <span class="hljs-string">"<span class="hljs-variable">$pkg_version</span>"</span> ]; <span class="hljs-keyword">then</span>
					<span class="hljs-built_in">echo</span>
					<span class="hljs-built_in">echo</span> <span class="hljs-string">"ERROR: '<span class="hljs-variable">$VERSION</span>' not found amongst <span class="hljs-variable">$pkg_manager</span> list results"</span>
					<span class="hljs-built_in">echo</span>
					<span class="hljs-built_in">exit</span> 1
				<span class="hljs-keyword">fi</span>
				<span class="hljs-keyword">if</span> version_gte <span class="hljs-string">"18.09"</span>; <span class="hljs-keyword">then</span>
					<span class="hljs-comment"># older versions don't support a cli package</span>
					search_command=<span class="hljs-string">"<span class="hljs-variable">$pkg_manager</span> list --showduplicates 'docker-ce-cli' | grep '<span class="hljs-variable">$pkg_pattern</span>' | tail -1 | awk '{print \$2}'"</span>
					cli_pkg_version=<span class="hljs-string">"<span class="hljs-subst">$($sh_c <span class="hljs-string">"<span class="hljs-variable">$search_command</span>"</span> | cut -d':' -f 2)</span>"</span>
				<span class="hljs-keyword">fi</span>
				<span class="hljs-comment"># Cut out the epoch and prefix with a '-'</span>
				pkg_version=<span class="hljs-string">"-<span class="hljs-subst">$(echo <span class="hljs-string">"<span class="hljs-variable">$pkg_version</span>"</span> | cut -d':' -f 2)</span>"</span>
			<span class="hljs-keyword">fi</span>
		<span class="hljs-keyword">fi</span>
		(
			pkgs=<span class="hljs-string">"docker-ce<span class="hljs-variable">$pkg_version</span>"</span>
			<span class="hljs-keyword">if</span> version_gte <span class="hljs-string">"18.09"</span>; <span class="hljs-keyword">then</span>
				<span class="hljs-comment"># older versions didn't ship the cli and containerd as separate packages</span>
				<span class="hljs-keyword">if</span> [ -n <span class="hljs-string">"<span class="hljs-variable">$cli_pkg_version</span>"</span> ]; <span class="hljs-keyword">then</span>
					pkgs=<span class="hljs-string">"<span class="hljs-variable">$pkgs</span> docker-ce-cli-<span class="hljs-variable">$cli_pkg_version</span> containerd.io"</span>
				<span class="hljs-keyword">else</span>
					pkgs=<span class="hljs-string">"<span class="hljs-variable">$pkgs</span> docker-ce-cli containerd.io"</span>
				<span class="hljs-keyword">fi</span>
			<span class="hljs-keyword">fi</span>
			<span class="hljs-keyword">if</span> version_gte <span class="hljs-string">"20.10"</span> &amp;&amp; [ <span class="hljs-string">"<span class="hljs-subst">$(uname -m)</span>"</span> = <span class="hljs-string">"x86_64"</span> ]; <span class="hljs-keyword">then</span>
					<span class="hljs-comment"># also install the latest version of the "docker scan" cli-plugin (only supported on x86 currently)</span>
					pkgs=<span class="hljs-string">"<span class="hljs-variable">$pkgs</span> docker-scan-plugin"</span>
			<span class="hljs-keyword">fi</span>
			<span class="hljs-keyword">if</span> version_gte <span class="hljs-string">"20.10"</span>; <span class="hljs-keyword">then</span>
				pkgs=<span class="hljs-string">"<span class="hljs-variable">$pkgs</span> docker-compose-plugin docker-ce-rootless-extras<span class="hljs-variable">$pkg_version</span>"</span>
			<span class="hljs-keyword">fi</span>
			<span class="hljs-comment"># TODO(thaJeztah) remove the $CHANNEL check once 22.06 and docker-buildx-plugin is published to the "stable" channel</span>
			<span class="hljs-keyword">if</span> [ <span class="hljs-string">"<span class="hljs-variable">$CHANNEL</span>"</span> = <span class="hljs-string">"test"</span> ] &amp;&amp; version_gte <span class="hljs-string">"22.06"</span>; <span class="hljs-keyword">then</span>
					pkgs=<span class="hljs-string">"<span class="hljs-variable">$pkgs</span> docker-buildx-plugin"</span>
			<span class="hljs-keyword">fi</span>
			<span class="hljs-keyword">if</span> ! is_dry_run; <span class="hljs-keyword">then</span>
				<span class="hljs-built_in">set</span> -x
			<span class="hljs-keyword">fi</span>
			<span class="hljs-variable">$sh_c</span> <span class="hljs-string">"<span class="hljs-variable">$pkg_manager</span> install -y -q <span class="hljs-variable">$pkgs</span>"</span>
		)
		echo_docker_as_nonroot
		<span class="hljs-built_in">exit</span> 0
		;;
	sles)
		<span class="hljs-keyword">if</span> [ <span class="hljs-string">"<span class="hljs-subst">$(uname -m)</span>"</span> != <span class="hljs-string">"s390x"</span> ]; <span class="hljs-keyword">then</span>
			<span class="hljs-built_in">echo</span> <span class="hljs-string">"Packages for SLES are currently only available for s390x"</span>
			<span class="hljs-built_in">exit</span> 1
		<span class="hljs-keyword">fi</span>

		sles_version=<span class="hljs-string">"<span class="hljs-variable">${dist_version##*.}</span>"</span>
		sles_repo=<span class="hljs-string">"<span class="hljs-variable">$DOWNLOAD_URL</span>/linux/<span class="hljs-variable">$lsb_dist</span>/<span class="hljs-variable">$REPO_FILE</span>"</span>
		opensuse_repo=<span class="hljs-string">"https://download.opensuse.org/repositories/security:SELinux/SLE_15_SP<span class="hljs-variable">$sles_version</span>/security:SELinux.repo"</span>
		<span class="hljs-keyword">if</span> ! curl -Ifs <span class="hljs-string">"<span class="hljs-variable">$sles_repo</span>"</span> &gt; /dev/null; <span class="hljs-keyword">then</span>
			<span class="hljs-built_in">echo</span> <span class="hljs-string">"Error: Unable to curl repository file <span class="hljs-variable">$sles_repo</span>, is it valid?"</span>
			<span class="hljs-built_in">exit</span> 1
		<span class="hljs-keyword">fi</span>
		pre_reqs=<span class="hljs-string">"ca-certificates curl libseccomp2 awk"</span>
		(
			<span class="hljs-keyword">if</span> ! is_dry_run; <span class="hljs-keyword">then</span>
				<span class="hljs-built_in">set</span> -x
			<span class="hljs-keyword">fi</span>
			<span class="hljs-variable">$sh_c</span> <span class="hljs-string">"zypper install -y <span class="hljs-variable">$pre_reqs</span>"</span>
			<span class="hljs-variable">$sh_c</span> <span class="hljs-string">"zypper addrepo <span class="hljs-variable">$sles_repo</span>"</span>
			<span class="hljs-keyword">if</span> ! is_dry_run; <span class="hljs-keyword">then</span>
					<span class="hljs-built_in">cat</span> &gt;&amp;2 &lt;&lt;-<span class="hljs-string">'EOF'</span>
					WARNING!!
					openSUSE repository (https://download.opensuse.org/repositories/security:SELinux) will be enabled now.
					Do you wish to <span class="hljs-built_in">continue</span>?
					You may press Ctrl+C now to abort this script.
					EOF
					( <span class="hljs-built_in">set</span> -x; <span class="hljs-built_in">sleep</span> 30 )
			<span class="hljs-keyword">fi</span>
			<span class="hljs-variable">$sh_c</span> <span class="hljs-string">"zypper addrepo <span class="hljs-variable">$opensuse_repo</span>"</span>
			<span class="hljs-variable">$sh_c</span> <span class="hljs-string">"zypper --gpg-auto-import-keys refresh"</span>
			<span class="hljs-variable">$sh_c</span> <span class="hljs-string">"zypper lr -d"</span>
		)
		pkg_version=<span class="hljs-string">""</span>
		<span class="hljs-keyword">if</span> [ -n <span class="hljs-string">"<span class="hljs-variable">$VERSION</span>"</span> ]; <span class="hljs-keyword">then</span>
			<span class="hljs-keyword">if</span> is_dry_run; <span class="hljs-keyword">then</span>
				<span class="hljs-built_in">echo</span> <span class="hljs-string">"# WARNING: VERSION pinning is not supported in DRY_RUN"</span>
			<span class="hljs-keyword">else</span>
				pkg_pattern=<span class="hljs-string">"<span class="hljs-subst">$(echo <span class="hljs-string">"<span class="hljs-variable">$VERSION</span>"</span> | sed <span class="hljs-string">"s/-ce-/\\\\.ce.*/g"</span> | sed <span class="hljs-string">"s/-/.*/g"</span>)</span>"</span>
				search_command=<span class="hljs-string">"zypper search -s --match-exact 'docker-ce' | grep '<span class="hljs-variable">$pkg_pattern</span>' | tail -1 | awk '{print \$6}'"</span>
				pkg_version=<span class="hljs-string">"<span class="hljs-subst">$($sh_c <span class="hljs-string">"<span class="hljs-variable">$search_command</span>"</span>)</span>"</span>
				<span class="hljs-built_in">echo</span> <span class="hljs-string">"INFO: Searching repository for VERSION '<span class="hljs-variable">$VERSION</span>'"</span>
				<span class="hljs-built_in">echo</span> <span class="hljs-string">"INFO: <span class="hljs-variable">$search_command</span>"</span>
				<span class="hljs-keyword">if</span> [ -z <span class="hljs-string">"<span class="hljs-variable">$pkg_version</span>"</span> ]; <span class="hljs-keyword">then</span>
					<span class="hljs-built_in">echo</span>
					<span class="hljs-built_in">echo</span> <span class="hljs-string">"ERROR: '<span class="hljs-variable">$VERSION</span>' not found amongst zypper list results"</span>
					<span class="hljs-built_in">echo</span>
					<span class="hljs-built_in">exit</span> 1
				<span class="hljs-keyword">fi</span>
				search_command=<span class="hljs-string">"zypper search -s --match-exact 'docker-ce-cli' | grep '<span class="hljs-variable">$pkg_pattern</span>' | tail -1 | awk '{print \$6}'"</span>
				<span class="hljs-comment"># It's okay for cli_pkg_version to be blank, since older versions don't support a cli package</span>
				cli_pkg_version=<span class="hljs-string">"<span class="hljs-subst">$($sh_c <span class="hljs-string">"<span class="hljs-variable">$search_command</span>"</span>)</span>"</span>
				pkg_version=<span class="hljs-string">"-<span class="hljs-variable">$pkg_version</span>"</span>

				search_command=<span class="hljs-string">"zypper search -s --match-exact 'docker-ce-rootless-extras' | grep '<span class="hljs-variable">$pkg_pattern</span>' | tail -1 | awk '{print \$6}'"</span>
				rootless_pkg_version=<span class="hljs-string">"<span class="hljs-subst">$($sh_c <span class="hljs-string">"<span class="hljs-variable">$search_command</span>"</span>)</span>"</span>
				rootless_pkg_version=<span class="hljs-string">"-<span class="hljs-variable">$rootless_pkg_version</span>"</span>
			<span class="hljs-keyword">fi</span>
		<span class="hljs-keyword">fi</span>
		(
			pkgs=<span class="hljs-string">"docker-ce<span class="hljs-variable">$pkg_version</span>"</span>
			<span class="hljs-keyword">if</span> version_gte <span class="hljs-string">"18.09"</span>; <span class="hljs-keyword">then</span>
				<span class="hljs-keyword">if</span> [ -n <span class="hljs-string">"<span class="hljs-variable">$cli_pkg_version</span>"</span> ]; <span class="hljs-keyword">then</span>
					<span class="hljs-comment"># older versions didn't ship the cli and containerd as separate packages</span>
					pkgs=<span class="hljs-string">"<span class="hljs-variable">$pkgs</span> docker-ce-cli-<span class="hljs-variable">$cli_pkg_version</span> containerd.io"</span>
				<span class="hljs-keyword">else</span>
					pkgs=<span class="hljs-string">"<span class="hljs-variable">$pkgs</span> docker-ce-cli containerd.io"</span>
				<span class="hljs-keyword">fi</span>
			<span class="hljs-keyword">fi</span>
			<span class="hljs-keyword">if</span> version_gte <span class="hljs-string">"20.10"</span>; <span class="hljs-keyword">then</span>
				pkgs=<span class="hljs-string">"<span class="hljs-variable">$pkgs</span> docker-compose-plugin docker-ce-rootless-extras<span class="hljs-variable">$pkg_version</span>"</span>
			<span class="hljs-keyword">fi</span>
			<span class="hljs-comment"># TODO(thaJeztah) remove the $CHANNEL check once 22.06 and docker-buildx-plugin is published to the "stable" channel</span>
			<span class="hljs-keyword">if</span> [ <span class="hljs-string">"<span class="hljs-variable">$CHANNEL</span>"</span> = <span class="hljs-string">"test"</span> ] &amp;&amp; version_gte <span class="hljs-string">"22.06"</span>; <span class="hljs-keyword">then</span>
					pkgs=<span class="hljs-string">"<span class="hljs-variable">$pkgs</span> docker-buildx-plugin"</span>
			<span class="hljs-keyword">fi</span>
			<span class="hljs-keyword">if</span> ! is_dry_run; <span class="hljs-keyword">then</span>
				<span class="hljs-built_in">set</span> -x
			<span class="hljs-keyword">fi</span>
			<span class="hljs-variable">$sh_c</span> <span class="hljs-string">"zypper -q install -y <span class="hljs-variable">$pkgs</span>"</span>
		)
		echo_docker_as_nonroot
		<span class="hljs-built_in">exit</span> 0
		;;
	*)
		<span class="hljs-keyword">if</span> [ -z <span class="hljs-string">"<span class="hljs-variable">$lsb_dist</span>"</span> ]; <span class="hljs-keyword">then</span>
			<span class="hljs-keyword">if</span> is_darwin; <span class="hljs-keyword">then</span>
				<span class="hljs-built_in">echo</span>
				<span class="hljs-built_in">echo</span> <span class="hljs-string">"ERROR: Unsupported operating system 'macOS'"</span>
				<span class="hljs-built_in">echo</span> <span class="hljs-string">"Please get Docker Desktop from https://www.docker.com/products/docker-desktop"</span>
				<span class="hljs-built_in">echo</span>
				<span class="hljs-built_in">exit</span> 1
			<span class="hljs-keyword">fi</span>
		<span class="hljs-keyword">fi</span>
		<span class="hljs-built_in">echo</span>
		<span class="hljs-built_in">echo</span> <span class="hljs-string">"ERROR: Unsupported distribution '<span class="hljs-variable">$lsb_dist</span>'"</span>
		<span class="hljs-built_in">echo</span>
		<span class="hljs-built_in">exit</span> 1
		;;
<span class="hljs-keyword">esac</span>
<span class="hljs-built_in">exit</span> 1

}

# wrapped up in a function so that we have some protection against only getting
# half the file during "curl | sh"
do_install