Tizen_4.0 base
[platform/upstream/docker-engine.git] / hack / install.sh
1 #!/bin/sh
2 set -e
3 #
4 # This script is meant for quick & easy install via:
5 #   'curl -sSL https://get.docker.com/ | sh'
6 # or:
7 #   'wget -qO- https://get.docker.com/ | sh'
8 #
9 # For test builds (ie. release candidates):
10 #   'curl -fsSL https://test.docker.com/ | sh'
11 # or:
12 #   'wget -qO- https://test.docker.com/ | sh'
13 #
14 # For experimental builds:
15 #   'curl -fsSL https://experimental.docker.com/ | sh'
16 # or:
17 #   'wget -qO- https://experimental.docker.com/ | sh'
18 #
19 # Docker Maintainers:
20 #   To update this script on https://get.docker.com,
21 #   use hack/release.sh during a normal release,
22 #   or the following one-liner for script hotfixes:
23 #     aws s3 cp --acl public-read hack/install.sh s3://get.docker.com/index
24 #
25
26 url="https://get.docker.com/"
27 apt_url="https://apt.dockerproject.org"
28 yum_url="https://yum.dockerproject.org"
29
30 docker_key="-----BEGIN PGP PUBLIC KEY BLOCK-----
31 Version: GnuPG v1
32
33 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
91 EJOQTvBR8Q==
92 =Yhur
93 -----END PGP PUBLIC KEY BLOCK-----
94 "
95
96 mirror=''
97 while [ $# -gt 0 ]; do
98         case "$1" in
99                 --mirror)
100                         mirror="$2"
101                         shift
102                         ;;
103                 *)
104                         echo "Illegal option $1"
105                         ;;
106         esac
107         shift $(( $# > 0 ? 1 : 0 ))
108 done
109
110 case "$mirror" in
111         AzureChinaCloud)
112                 apt_url="https://mirror.azure.cn/docker-engine/apt"
113                 yum_url="https://mirror.azure.cn/docker-engine/yum"
114                 ;;
115         Aliyun)
116                 apt_url="https://mirrors.aliyun.com/docker-engine/apt"
117                 yum_url="https://mirrors.aliyun.com/docker-engine/yum"
118                 ;;
119 esac
120
121 command_exists() {
122         command -v "$@" > /dev/null 2>&1
123 }
124
125 echo_docker_as_nonroot() {
126         if command_exists docker && [ -e /var/run/docker.sock ]; then
127                 (
128                         set -x
129                         $sh_c 'docker version'
130                 ) || true
131         fi
132         your_user=your-user
133         [ "$user" != 'root' ] && your_user="$user"
134         # intentionally mixed spaces and tabs here -- tabs are stripped by "<<-EOF", spaces are kept in the output
135         cat <<-EOF
136
137         If you would like to use Docker as a non-root user, you should now consider
138         adding your user to the "docker" group with something like:
139
140           sudo usermod -aG docker $your_user
141
142         Remember that you will have to log out and back in for this to take effect!
143
144         WARNING: Adding a user to the "docker" group will grant the ability to run
145                  containers which can be used to obtain root privileges on the
146                  docker host.
147                  Refer to https://docs.docker.com/engine/security/security/#docker-daemon-attack-surface
148                  for more information.
149
150         EOF
151 }
152
153 # Check if this is a forked Linux distro
154 check_forked() {
155
156         # Check for lsb_release command existence, it usually exists in forked distros
157         if command_exists lsb_release; then
158                 # Check if the `-u` option is supported
159                 set +e
160                 lsb_release -a -u > /dev/null 2>&1
161                 lsb_release_exit_code=$?
162                 set -e
163
164                 # Check if the command has exited successfully, it means we're in a forked distro
165                 if [ "$lsb_release_exit_code" = "0" ]; then
166                         # Print info about current distro
167                         cat <<-EOF
168                         You're using '$lsb_dist' version '$dist_version'.
169                         EOF
170
171                         # Get the upstream release info
172                         lsb_dist=$(lsb_release -a -u 2>&1 | tr '[:upper:]' '[:lower:]' | grep -E 'id' | cut -d ':' -f 2 | tr -d '[[:space:]]')
173                         dist_version=$(lsb_release -a -u 2>&1 | tr '[:upper:]' '[:lower:]' | grep -E 'codename' | cut -d ':' -f 2 | tr -d '[[:space:]]')
174
175                         # Print info about upstream distro
176                         cat <<-EOF
177                         Upstream release is '$lsb_dist' version '$dist_version'.
178                         EOF
179                 else
180                         if [ -r /etc/debian_version ] && [ "$lsb_dist" != "ubuntu" ] && [ "$lsb_dist" != "raspbian" ]; then
181                                 # We're Debian and don't even know it!
182                                 lsb_dist=debian
183                                 dist_version="$(cat /etc/debian_version | sed 's/\/.*//' | sed 's/\..*//')"
184                                 case "$dist_version" in
185                                         9)
186                                                 dist_version="stretch"
187                                         ;;
188                                         8|'Kali Linux 2')
189                                                 dist_version="jessie"
190                                         ;;
191                                         7)
192                                                 dist_version="wheezy"
193                                         ;;
194                                 esac
195                         fi
196                 fi
197         fi
198 }
199
200 semverParse() {
201         major="${1%%.*}"
202         minor="${1#$major.}"
203         minor="${minor%%.*}"
204         patch="${1#$major.$minor.}"
205         patch="${patch%%[-.]*}"
206 }
207
208 do_install() {
209         architecture=$(uname -m)
210         case $architecture in
211                 # officially supported
212                 amd64|x86_64)
213                         ;;
214                 # unofficially supported with available repositories
215                 armv6l|armv7l)
216                         ;;
217                 # unofficially supported without available repositories
218                 aarch64|arm64|ppc64le|s390x)
219                         cat 1>&2 <<-EOF
220                         Error: This install script does not support $architecture, because no
221                         $architecture package exists in Docker's repositories.
222
223                         Other install options include checking your distribution's package repository
224                         for a version of Docker, or building Docker from source.
225                         EOF
226                         exit 1
227                         ;;
228                 # not supported
229                 *)
230                         cat >&2 <<-EOF
231                         Error: $architecture is not a recognized platform.
232                         EOF
233                         exit 1
234                         ;;
235         esac
236
237         if command_exists docker; then
238                 version="$(docker -v | cut -d ' ' -f3 | cut -d ',' -f1)"
239                 MAJOR_W=1
240                 MINOR_W=10
241
242                 semverParse $version
243
244                 shouldWarn=0
245                 if [ $major -lt $MAJOR_W ]; then
246                         shouldWarn=1
247                 fi
248
249                 if [ $major -le $MAJOR_W ] && [ $minor -lt $MINOR_W ]; then
250                         shouldWarn=1
251                 fi
252
253                 cat >&2 <<-'EOF'
254                         Warning: the "docker" command appears to already exist on this system.
255
256                         If you already have Docker installed, this script can cause trouble, which is
257                         why we're displaying this warning and provide the opportunity to cancel the
258                         installation.
259
260                         If you installed the current Docker package using this script and are using it
261                 EOF
262
263                 if [ $shouldWarn -eq 1 ]; then
264                         cat >&2 <<-'EOF'
265                         again to update Docker, we urge you to migrate your image store before upgrading
266                         to v1.10+.
267
268                         You can find instructions for this here:
269                         https://github.com/docker/docker/wiki/Engine-v1.10.0-content-addressability-migration
270                         EOF
271                 else
272                         cat >&2 <<-'EOF'
273                         again to update Docker, you can safely ignore this message.
274                         EOF
275                 fi
276
277                 cat >&2 <<-'EOF'
278
279                         You may press Ctrl+C now to abort this script.
280                 EOF
281                 ( set -x; sleep 20 )
282         fi
283
284         user="$(id -un 2>/dev/null || true)"
285
286         sh_c='sh -c'
287         if [ "$user" != 'root' ]; then
288                 if command_exists sudo; then
289                         sh_c='sudo -E sh -c'
290                 elif command_exists su; then
291                         sh_c='su -c'
292                 else
293                         cat >&2 <<-'EOF'
294                         Error: this installer needs the ability to run commands as root.
295                         We are unable to find either "sudo" or "su" available to make this happen.
296                         EOF
297                         exit 1
298                 fi
299         fi
300
301         curl=''
302         if command_exists curl; then
303                 curl='curl -sSL'
304         elif command_exists wget; then
305                 curl='wget -qO-'
306         elif command_exists busybox && busybox --list-modules | grep -q wget; then
307                 curl='busybox wget -qO-'
308         fi
309
310         # check to see which repo they are trying to install from
311         if [ -z "$repo" ]; then
312                 repo='main'
313                 if [ "https://test.docker.com/" = "$url" ]; then
314                         repo='testing'
315                 elif [ "https://experimental.docker.com/" = "$url" ]; then
316                         repo='experimental'
317                 fi
318         fi
319
320         # perform some very rudimentary platform detection
321         lsb_dist=''
322         dist_version=''
323         if command_exists lsb_release; then
324                 lsb_dist="$(lsb_release -si)"
325         fi
326         if [ -z "$lsb_dist" ] && [ -r /etc/lsb-release ]; then
327                 lsb_dist="$(. /etc/lsb-release && echo "$DISTRIB_ID")"
328         fi
329         if [ -z "$lsb_dist" ] && [ -r /etc/debian_version ]; then
330                 lsb_dist='debian'
331         fi
332         if [ -z "$lsb_dist" ] && [ -r /etc/fedora-release ]; then
333                 lsb_dist='fedora'
334         fi
335         if [ -z "$lsb_dist" ] && [ -r /etc/oracle-release ]; then
336                 lsb_dist='oracleserver'
337         fi
338         if [ -z "$lsb_dist" ] && [ -r /etc/centos-release ]; then
339                 lsb_dist='centos'
340         fi
341         if [ -z "$lsb_dist" ] && [ -r /etc/redhat-release ]; then
342                 lsb_dist='redhat'
343         fi
344         if [ -z "$lsb_dist" ] && [ -r /etc/photon-release ]; then
345                 lsb_dist='photon'
346         fi
347         if [ -z "$lsb_dist" ] && [ -r /etc/os-release ]; then
348                 lsb_dist="$(. /etc/os-release && echo "$ID")"
349         fi
350
351         lsb_dist="$(echo "$lsb_dist" | tr '[:upper:]' '[:lower:]')"
352
353         # Special case redhatenterpriseserver
354         if [ "${lsb_dist}" = "redhatenterpriseserver" ]; then
355                 # Set it to redhat, it will be changed to centos below anyways
356                 lsb_dist='redhat'
357         fi
358
359         case "$lsb_dist" in
360
361                 ubuntu)
362                         if command_exists lsb_release; then
363                                 dist_version="$(lsb_release --codename | cut -f2)"
364                         fi
365                         if [ -z "$dist_version" ] && [ -r /etc/lsb-release ]; then
366                                 dist_version="$(. /etc/lsb-release && echo "$DISTRIB_CODENAME")"
367                         fi
368                 ;;
369
370                 debian|raspbian)
371                         dist_version="$(cat /etc/debian_version | sed 's/\/.*//' | sed 's/\..*//')"
372                         case "$dist_version" in
373                                 9)
374                                         dist_version="stretch"
375                                 ;;
376                                 8)
377                                         dist_version="jessie"
378                                 ;;
379                                 7)
380                                         dist_version="wheezy"
381                                 ;;
382                         esac
383                 ;;
384
385                 oracleserver)
386                         # need to switch lsb_dist to match yum repo URL
387                         lsb_dist="oraclelinux"
388                         dist_version="$(rpm -q --whatprovides redhat-release --queryformat "%{VERSION}\n" | sed 's/\/.*//' | sed 's/\..*//' | sed 's/Server*//')"
389                 ;;
390
391                 fedora|centos|redhat)
392                         dist_version="$(rpm -q --whatprovides ${lsb_dist}-release --queryformat "%{VERSION}\n" | sed 's/\/.*//' | sed 's/\..*//' | sed 's/Server*//' | sort | tail -1)"
393                 ;;
394
395                 "vmware photon")
396                         lsb_dist="photon"
397                         dist_version="$(. /etc/os-release && echo "$VERSION_ID")"
398                 ;;
399
400                 *)
401                         if command_exists lsb_release; then
402                                 dist_version="$(lsb_release --codename | cut -f2)"
403                         fi
404                         if [ -z "$dist_version" ] && [ -r /etc/os-release ]; then
405                                 dist_version="$(. /etc/os-release && echo "$VERSION_ID")"
406                         fi
407                 ;;
408
409
410         esac
411
412         # Check if this is a forked Linux distro
413         check_forked
414
415         # Run setup for each distro accordingly
416         case "$lsb_dist" in
417                 ubuntu|debian|raspbian)
418                         export DEBIAN_FRONTEND=noninteractive
419
420                         did_apt_get_update=
421                         apt_get_update() {
422                                 if [ -z "$did_apt_get_update" ]; then
423                                         ( set -x; $sh_c 'sleep 3; apt-get update' )
424                                         did_apt_get_update=1
425                                 fi
426                         }
427
428                         if [ "$lsb_dist" != "raspbian" ]; then
429                                 # aufs is preferred over devicemapper; try to ensure the driver is available.
430                                 if ! grep -q aufs /proc/filesystems && ! $sh_c 'modprobe aufs'; then
431                                         if uname -r | grep -q -- '-generic' && dpkg -l 'linux-image-*-generic' | grep -qE '^ii|^hi' 2>/dev/null; then
432                                                 kern_extras="linux-image-extra-$(uname -r) linux-image-extra-virtual"
433
434                                                 apt_get_update
435                                                 ( set -x; $sh_c 'sleep 3; apt-get install -y -q '"$kern_extras" ) || true
436
437                                                 if ! grep -q aufs /proc/filesystems && ! $sh_c 'modprobe aufs'; then
438                                                         echo >&2 'Warning: tried to install '"$kern_extras"' (for AUFS)'
439                                                         echo >&2 ' but we still have no AUFS.  Docker may not work. Proceeding anyways!'
440                                                         ( set -x; sleep 10 )
441                                                 fi
442                                         else
443                                                 echo >&2 'Warning: current kernel is not supported by the linux-image-extra-virtual'
444                                                 echo >&2 ' package.  We have no AUFS support.  Consider installing the packages'
445                                                 echo >&2 ' "linux-image-virtual" and "linux-image-extra-virtual" for AUFS support.'
446                                                 ( set -x; sleep 10 )
447                                         fi
448                                 fi
449                         fi
450
451                         # install apparmor utils if they're missing and apparmor is enabled in the kernel
452                         # otherwise Docker will fail to start
453                         if [ "$(cat /sys/module/apparmor/parameters/enabled 2>/dev/null)" = 'Y' ]; then
454                                 if command -v apparmor_parser >/dev/null 2>&1; then
455                                         echo 'apparmor is enabled in the kernel and apparmor utils were already installed'
456                                 else
457                                         echo 'apparmor is enabled in the kernel, but apparmor_parser is missing. Trying to install it..'
458                                         apt_get_update
459                                         ( set -x; $sh_c 'sleep 3; apt-get install -y -q apparmor' )
460                                 fi
461                         fi
462
463                         if [ ! -e /usr/lib/apt/methods/https ]; then
464                                 apt_get_update
465                                 ( set -x; $sh_c 'sleep 3; apt-get install -y -q apt-transport-https ca-certificates' )
466                         fi
467                         if [ -z "$curl" ]; then
468                                 apt_get_update
469                                 ( set -x; $sh_c 'sleep 3; apt-get install -y -q curl ca-certificates' )
470                                 curl='curl -sSL'
471                         fi
472                         if ! command -v gpg > /dev/null; then
473                                 apt_get_update
474                                 ( set -x; $sh_c 'sleep 3; apt-get install -y -q gnupg2 || apt-get install -y -q gnupg' )
475                         fi
476
477                         # dirmngr is a separate package in ubuntu yakkety; see https://bugs.launchpad.net/ubuntu/+source/apt/+bug/1634464
478                         if ! command -v dirmngr > /dev/null; then
479                                 apt_get_update
480                                 ( set -x; $sh_c 'sleep 3; apt-get install -y -q dirmngr' )
481                         fi
482
483                         (
484                         set -x
485                         echo "$docker_key" | $sh_c 'apt-key add -'
486                         $sh_c "mkdir -p /etc/apt/sources.list.d"
487                         $sh_c "echo deb \[arch=$(dpkg --print-architecture)\] ${apt_url}/repo ${lsb_dist}-${dist_version} ${repo} > /etc/apt/sources.list.d/docker.list"
488                         $sh_c 'sleep 3; apt-get update; apt-get install -y -q docker-engine'
489                         )
490                         echo_docker_as_nonroot
491                         exit 0
492                         ;;
493
494                 fedora|centos|redhat|oraclelinux|photon)
495                         if [ "${lsb_dist}" = "redhat" ]; then
496                                 # we use the centos repository for both redhat and centos releases
497                                 lsb_dist='centos'
498                         fi
499                         $sh_c "cat >/etc/yum.repos.d/docker-${repo}.repo" <<-EOF
500                         [docker-${repo}-repo]
501                         name=Docker ${repo} Repository
502                         baseurl=${yum_url}/repo/${repo}/${lsb_dist}/${dist_version}
503                         enabled=1
504                         gpgcheck=1
505                         gpgkey=${yum_url}/gpg
506                         EOF
507                         if [ "$lsb_dist" = "fedora" ] && [ "$dist_version" -ge "22" ]; then
508                                 (
509                                         set -x
510                                         $sh_c 'sleep 3; dnf -y -q install docker-engine'
511                                 )
512                         elif [ "$lsb_dist" = "photon" ]; then
513                                 (
514                                         set -x
515                                         $sh_c 'sleep 3; tdnf -y install docker-engine'
516                                 )
517                         else
518                                 (
519                                         set -x
520                                         $sh_c 'sleep 3; yum -y -q install docker-engine'
521                                 )
522                         fi
523                         echo_docker_as_nonroot
524                         exit 0
525                         ;;
526         esac
527
528         # intentionally mixed spaces and tabs here -- tabs are stripped by "<<-'EOF'", spaces are kept in the output
529         cat >&2 <<-'EOF'
530
531           Either your platform is not easily detectable, is not supported by this
532           installer script (yet - PRs welcome! [hack/install.sh]), or does not yet have
533           a package for Docker.  Please visit the following URL for more detailed
534           installation instructions:
535
536             https://docs.docker.com/engine/installation/
537
538         EOF
539         exit 1
540 }
541
542 # wrapped up in a function so that we have some protection against only getting
543 # half the file during "curl | sh"
544 do_install