When docker is not passed the --storage-driver option, it tries to auto detect the storage driver. Roughly: 1. If existing storage paths like /var/lib/docker/aufs exist, it will choose that driver. 2. It has a priority list of drivers to scan in order (driver.go) As it stands the ordering is aufs, btrfs and then devicemapper. 3. Docker will attempt to "init" each driver. aufs, for example, tests for insmod'ing aufs and also looks into /proc/filesystems. The fact that we installed aufs-tools and linux drivers (for aufs driver) was a programming error since we want docker to use devicemapper. However, what is curious is why docker still ended up choosing devicemapper despite having all aufs requirements (as we do not pass --storage-driver explicitly). The answer is that "apt-get install aufs-tool linux-image-* docker-engine" can install packages in any order! This means there is a race on how docker chooses the storage engine. In most cases, since linux-image-* is a big package, docker gets to install first and ends up using devicemapper since aufs module is not found yet. For some people, linux-image-* possibly installs first and thus docker chooses aufs! Mystery solved. Part of #183
92 lines
3.4 KiB
Bash
92 lines
3.4 KiB
Bash
#!/bin/bash
|
|
|
|
set -euv -o pipefail
|
|
|
|
readonly SOURCE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
|
|
readonly arg_provider="${1:-generic}"
|
|
readonly arg_infraversionpath="${SOURCE_DIR}/${2:-}"
|
|
|
|
function die {
|
|
echo $1
|
|
exit 1
|
|
}
|
|
|
|
export DEBIAN_FRONTEND=noninteractive
|
|
|
|
apt-get -o Dpkg::Options::="--force-confdef" update -y
|
|
apt-get -o Dpkg::Options::="--force-confdef" dist-upgrade -y
|
|
|
|
echo "==> Installing required packages"
|
|
|
|
debconf-set-selections <<< 'mysql-server mysql-server/root_password password password'
|
|
debconf-set-selections <<< 'mysql-server mysql-server/root_password_again password password'
|
|
|
|
# this enables automatic security upgrades (https://help.ubuntu.com/community/AutomaticSecurityUpdates)
|
|
apt-get -y install \
|
|
acl \
|
|
awscli \
|
|
btrfs-tools \
|
|
build-essential \
|
|
cron \
|
|
curl \
|
|
iptables \
|
|
logrotate \
|
|
mysql-server-5.7 \
|
|
nginx-full \
|
|
openssh-server \
|
|
pwgen \
|
|
rcconf \
|
|
swaks \
|
|
unattended-upgrades \
|
|
unbound
|
|
|
|
echo "==> Installing node.js"
|
|
mkdir -p /usr/local/node-6.9.2
|
|
curl -sL https://nodejs.org/dist/v6.9.2/node-v6.9.2-linux-x64.tar.gz | tar zxvf - --strip-components=1 -C /usr/local/node-6.9.2
|
|
ln -sf /usr/local/node-6.9.2/bin/node /usr/bin/node
|
|
ln -sf /usr/local/node-6.9.2/bin/npm /usr/bin/npm
|
|
apt-get install -y python # Install python which is required for npm rebuild
|
|
[[ "$(python --version 2>&1)" == "Python 2.7."* ]] || die "Expecting python version to be 2.7.x"
|
|
|
|
# https://docs.docker.com/engine/installation/linux/ubuntulinux/
|
|
echo "==> Installing Docker"
|
|
apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
|
|
echo "deb https://apt.dockerproject.org/repo ubuntu-xenial main" > /etc/apt/sources.list.d/docker.list
|
|
apt-get -y update
|
|
apt-get -y install docker-engine=1.12.5-0~ubuntu-xenial # apt-cache madison docker-engine
|
|
storage_driver=$(docker info | grep "Storage Driver" | sed 's/.*: //')
|
|
if [[ "${storage_driver}" != "devicemapper" ]]; then
|
|
echo "Docker is using "${storage_driver}" instead of devicemapper. Trying to fix this."
|
|
systemctl stop docker
|
|
rm -rf /var/lib/docker
|
|
sed -e 's,^ExecStart=.*$,ExecStart=/usr/bin/docker daemon -H fd:// --log-driver=journald --exec-opt native.cgroupdriver=cgroupfs --storage-driver=devicemapper,' -i /lib/systemd/system/docker.service
|
|
systemctl daemon-reload
|
|
systemctl start docker
|
|
fi
|
|
|
|
echo "==> Enable memory accounting"
|
|
sed -e 's/^GRUB_CMDLINE_LINUX="\(.*\)"$/GRUB_CMDLINE_LINUX="\1 cgroup_enable=memory swapaccount=1 panic_on_oops=1 panic=5"/' -i /etc/default/grub
|
|
update-grub
|
|
|
|
echo "==> Downloading docker images"
|
|
if [ ! -f "${arg_infraversionpath}/infra_version.js" ]; then
|
|
echo "No infra_versions.js found"
|
|
exit 1
|
|
fi
|
|
|
|
images=$(node -e "var i = require('${arg_infraversionpath}/infra_version.js'); console.log(i.baseImages.join(' '), Object.keys(i.images).map(function (x) { return i.images[x].tag; }).join(' '));")
|
|
|
|
echo -e "\tPulling docker images: ${images}"
|
|
for image in ${images}; do
|
|
docker pull "${image}"
|
|
done
|
|
|
|
echo "==> Install collectd"
|
|
if ! apt-get install -y collectd collectd-utils; then
|
|
# FQDNLookup is true in default debian config. The box code has a custom collectd.conf that fixes this
|
|
echo "Failed to install collectd. Presumably because of http://mailman.verplant.org/pipermail/collectd/2015-March/006491.html"
|
|
sed -e 's/^FQDNLookup true/FQDNLookup false/' -i /etc/collectd/collectd.conf
|
|
fi
|
|
|