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+ gpg_fingerprint=" 58118E89F3A912897C070ADBF76221572C52609D"
30+
31+ key_servers="
32+ ha.pool.sks-keyservers.net
33+ pgp.mit.edu
34+ keyserver.ubuntu.com
35+ "
36+
37+ command_exists () {
38+ command -v " $@ " > /dev/null 2>&1
39+ }
40+
41+ semverParse () {
42+ major=" ${1%% .* } "
43+ minor=" ${1# $major .} "
44+ minor=" ${minor%% .* } "
45+ patch=" ${1# $major .$minor .} "
46+ patch=" ${patch%% [-.]* } "
47+ }
48+
49+ do_install () {
50+ case " $( uname -m) " in
51+ * 64)
52+ ;;
53+ * )
54+ cat >&2 << -'EOF '
55+ Error: you are not using a 64bit platform.
56+ Docker currently only supports 64bit platforms.
57+ EOF
58+ exit 1
59+ ;;
60+ esac
61+
62+ user=" $( id -un 2> /dev/null || true) "
63+
64+ sh_c=' sh -c'
65+ if [ " $user " != ' root' ]; then
66+ if command_exists sudo; then
67+ sh_c=' sudo -E sh -c'
68+ elif command_exists su; then
69+ sh_c=' su -c'
70+ else
71+ cat >&2 << -'EOF '
72+ Error: this installer needs the ability to run commands as root.
73+ We are unable to find either "sudo" or "su" available to make this happen.
74+ EOF
75+ exit 1
76+ fi
77+ fi
78+
79+ curl=' '
80+ if command_exists curl; then
81+ curl=' curl -sSL'
82+ elif command_exists wget; then
83+ curl=' wget -qO-'
84+ elif command_exists busybox && busybox --list-modules | grep -q wget; then
85+ curl=' busybox wget -qO-'
86+ fi
87+
88+ # check to see which repo they are trying to install from
89+ if [ -z " $repo " ]; then
90+ repo=' main'
91+ if [ " https://test.docker.com/" = " $url " ]; then
92+ repo=' testing'
93+ elif [ " https://experimental.docker.com/" = " $url " ]; then
94+ repo=' experimental'
95+ fi
96+ fi
97+
98+ # perform some very rudimentary platform detection
99+ lsb_dist=' '
100+ dist_version=' '
101+ if command_exists lsb_release; then
102+ lsb_dist=" $( lsb_release -si) "
103+ fi
104+ if [ -z " $lsb_dist " ] && [ -r /etc/lsb-release ]; then
105+ lsb_dist=" $( . /etc/lsb-release && echo " $DISTRIB_ID " ) "
106+ fi
107+ if [ -z " $lsb_dist " ] && [ -r /etc/debian_version ]; then
108+ lsb_dist=' debian'
109+ fi
110+ if [ -z " $lsb_dist " ] && [ -r /etc/fedora-release ]; then
111+ lsb_dist=' fedora'
112+ fi
113+ if [ -z " $lsb_dist " ] && [ -r /etc/oracle-release ]; then
114+ lsb_dist=' oracleserver'
115+ fi
116+ if [ -z " $lsb_dist " ]; then
117+ if [ -r /etc/centos-release ] || [ -r /etc/redhat-release ]; then
118+ lsb_dist=' centos'
119+ fi
120+ fi
121+ if [ -z " $lsb_dist " ] && [ -r /etc/os-release ]; then
122+ lsb_dist=" $( . /etc/os-release && echo " $ID " ) "
123+ fi
124+
125+ lsb_dist=" $( echo " $lsb_dist " | tr ' [:upper:]' ' [:lower:]' ) "
126+
127+ case " $lsb_dist " in
128+
129+ ubuntu)
130+ if command_exists lsb_release; then
131+ dist_version=" $( lsb_release --codename | cut -f2) "
132+ fi
133+ if [ -z " $dist_version " ] && [ -r /etc/lsb-release ]; then
134+ dist_version=" $( . /etc/lsb-release && echo " $DISTRIB_CODENAME " ) "
135+ fi
136+ ;;
137+
138+ debian)
139+ dist_version=" $( cat /etc/debian_version | sed ' s/\/.*//' | sed ' s/\..*//' ) "
140+ case " $dist_version " in
141+ 8)
142+ dist_version=" jessie"
143+ ;;
144+ 7)
145+ dist_version=" wheezy"
146+ ;;
147+ esac
148+ ;;
149+
150+ oracleserver)
151+ # need to switch lsb_dist to match yum repo URL
152+ lsb_dist=" oraclelinux"
153+ dist_version=" $( rpm -q --whatprovides redhat-release --queryformat " %{VERSION}\n" | sed ' s/\/.*//' | sed ' s/\..*//' | sed ' s/Server*//' ) "
154+ ;;
155+
156+ fedora|centos)
157+ dist_version=" $( rpm -q --whatprovides redhat-release --queryformat " %{VERSION}\n" | sed ' s/\/.*//' | sed ' s/\..*//' | sed ' s/Server*//' ) "
158+ ;;
159+
160+ * )
161+ if command_exists lsb_release; then
162+ dist_version=" $( lsb_release --codename | cut -f2) "
163+ fi
164+ if [ -z " $dist_version " ] && [ -r /etc/os-release ]; then
165+ dist_version=" $( . /etc/os-release && echo " $VERSION_ID " ) "
166+ fi
167+ ;;
168+
169+
170+ esac
171+
172+
173+ # Run setup for each distro accordingly
174+ case " $lsb_dist " in
175+ ubuntu|debian)
176+ export DEBIAN_FRONTEND=noninteractive
177+
178+ did_apt_get_update=
179+ apt_get_update () {
180+ if [ -z " $did_apt_get_update " ]; then
181+ ( set -x; $sh_c ' sleep 3; apt-get update' )
182+ did_apt_get_update=1
183+ fi
184+ }
185+
186+ # aufs is preferred over devicemapper; try to ensure the driver is available.
187+ if ! grep -q aufs /proc/filesystems && ! $sh_c ' modprobe aufs' ; then
188+ if uname -r | grep -q -- ' -generic' && dpkg -l ' linux-image-*-generic' | grep -qE ' ^ii|^hi' 2> /dev/null; then
189+ kern_extras=" linux-image-extra-$( uname -r) linux-image-extra-virtual"
190+
191+ apt_get_update
192+ ( set -x; $sh_c ' sleep 3; apt-get install -y -q ' " $kern_extras " ) || true
193+
194+ if ! grep -q aufs /proc/filesystems && ! $sh_c ' modprobe aufs' ; then
195+ echo >&2 ' Warning: tried to install ' " $kern_extras " ' (for AUFS)'
196+ echo >&2 ' but we still have no AUFS. Docker may not work. Proceeding anyways!'
197+ ( set -x; sleep 10 )
198+ fi
199+ else
200+ echo >&2 ' Warning: current kernel is not supported by the linux-image-extra-virtual'
201+ echo >&2 ' package. We have no AUFS support. Consider installing the packages'
202+ echo >&2 ' linux-image-virtual kernel and linux-image-extra-virtual for AUFS support.'
203+ ( set -x; sleep 10 )
204+ fi
205+ fi
206+
207+ # install apparmor utils if they're missing and apparmor is enabled in the kernel
208+ # otherwise Docker will fail to start
209+ if [ " $( cat /sys/module/apparmor/parameters/enabled 2> /dev/null) " = ' Y' ]; then
210+ if command -v apparmor_parser > /dev/null 2>&1 ; then
211+ echo ' apparmor is enabled in the kernel and apparmor utils were already installed'
212+ else
213+ echo ' apparmor is enabled in the kernel, but apparmor_parser missing'
214+ apt_get_update
215+ ( set -x; $sh_c ' sleep 3; apt-get install -y -q apparmor' )
216+ fi
217+ fi
218+
219+ if [ ! -e /usr/lib/apt/methods/https ]; then
220+ apt_get_update
221+ ( set -x; $sh_c ' sleep 3; apt-get install -y -q apt-transport-https ca-certificates' )
222+ fi
223+ if [ -z " $curl " ]; then
224+ apt_get_update
225+ ( set -x; $sh_c ' sleep 3; apt-get install -y -q curl ca-certificates' )
226+ curl=' curl -sSL'
227+ fi
228+ (
229+ set -x
230+ for key_server in $key_servers ; do
231+ $sh_c " apt-key adv --keyserver hkp://${key_server} :80 --recv-keys ${gpg_fingerprint} " && break
232+ done
233+ $sh_c " apt-key adv -k ${gpg_fingerprint} >/dev/null"
234+ $sh_c " mkdir -p /etc/apt/sources.list.d"
235+ $sh_c " echo deb [arch=$( dpkg --print-architecture) ] ${apt_url} /repo ${lsb_dist} -${dist_version} ${repo} > /etc/apt/sources.list.d/docker.list"
236+ $sh_c ' sleep 3; apt-get update'
237+ if [ -z " $DOCKER_VERSION " ]; then
238+ $sh_c ' apt-get -o Dpkg::Options::="--force-confnew" install -y -q docker-engine'
239+ else
240+ $sh_c " apt-get -o Dpkg::Options::=\" --force-confnew\" install -y -q docker-engine=$DOCKER_VERSION "
241+ fi
242+ )
243+ exit 0
244+ ;;
245+
246+ fedora|centos|oraclelinux)
247+ $sh_c " cat >/etc/yum.repos.d/docker-${repo} .repo" << -EOF
248+ [docker-${repo} -repo]
249+ name=Docker ${repo} Repository
250+ baseurl=${yum_url} /repo/${repo} /${lsb_dist} /${dist_version}
251+ enabled=1
252+ gpgcheck=1
253+ gpgkey=${yum_url} /gpg
254+ EOF
255+ if [ " $lsb_dist " = " fedora" ] && [ " $dist_version " -ge " 22" ]; then
256+ (
257+ set -x
258+ $sh_c ' sleep 3; dnf -y -q install docker-engine'
259+ )
260+ else
261+ (
262+ set -x
263+ $sh_c ' sleep 3; yum -y -q install docker-engine'
264+ )
265+ fi
266+ exit 0
267+ ;;
268+ gentoo)
269+ if [ " $url " = " https://test.docker.com/" ]; then
270+ # intentionally mixed spaces and tabs here -- tabs are stripped by "<<-'EOF'", spaces are kept in the output
271+ cat >&2 << -'EOF '
272+
273+ You appear to be trying to install the latest nightly build in Gentoo.'
274+ The portage tree should contain the latest stable release of Docker, but'
275+ if you want something more recent, you can always use the live ebuild'
276+ provided in the "docker" overlay available via layman. For more'
277+ instructions, please see the following URL:'
278+
279+ https://github.com/tianon/docker-overlay#using-this-overlay'
280+
281+ After adding the "docker" overlay, you should be able to:'
282+
283+ emerge -av =app-emulation/docker-9999'
284+
285+ EOF
286+ exit 1
287+ fi
288+
289+ (
290+ set -x
291+ $sh_c ' sleep 3; emerge app-emulation/docker'
292+ )
293+ exit 0
294+ ;;
295+ esac
296+
297+ # intentionally mixed spaces and tabs here -- tabs are stripped by "<<-'EOF'", spaces are kept in the output
298+ cat >&2 << -'EOF '
299+
300+ Either your platform is not easily detectable, is not supported by this
301+ installer script (yet - PRs welcome! [hack/install.sh]), or does not yet have
302+ a package for Docker. Please visit the following URL for more detailed
303+ installation instructions:
304+
305+ https://docs.docker.com/engine/installation/
306+
307+ EOF
308+ exit 1
309+ }
310+
311+ # wrapped up in a function so that we have some protection against only getting
312+ # half the file during "curl | sh"
313+ do_install
0 commit comments