From 69716eb42f18c037c0ad2608fe0856e0df3df56f Mon Sep 17 00:00:00 2001 From: Hongbin Lu Date: Thu, 13 Apr 2017 00:56:04 -0400 Subject: [PATCH] Add docker installation script There are several projects that tried to install docker in different ways. This potentially lead to failure of more than one such services were enabled. This commit consolidate docker installation into a devstack plugin so that other services could depend on it. The initial script was mainly from Kuryr-libnetwork. Kuryr, Fuxi, and Zun might leverage this script to install Docker in the future. Change-Id: I97dbff2f361acc98b12ec6f40ab115c8548477a3 --- README.rst | 20 +++++++++ devstack/lib/docker | 106 ++++++++++++++++++++++++++++++++++++++++++++ devstack/plugin.sh | 37 ++++++++++++++++ devstack/settings | 6 +++ 4 files changed, 169 insertions(+) create mode 100644 README.rst create mode 100644 devstack/lib/docker create mode 100644 devstack/plugin.sh create mode 100644 devstack/settings diff --git a/README.rst b/README.rst new file mode 100644 index 0000000..a372923 --- /dev/null +++ b/README.rst @@ -0,0 +1,20 @@ +================= + Container Plugin +================= + +This plugin enables installation of container engine on Devstack. The default +container engine is Docker. + +====================== + Enabling in Devstack +====================== + +1. Download DevStack + +2. Add this repo as an external repository:: + + > cat local.conf + [[local|localrc]] + enable_plugin devstack-plugin-container https://github.com/openstack/devstack-plugin-container + +3. run ``stack.sh`` \ No newline at end of file diff --git a/devstack/lib/docker b/devstack/lib/docker new file mode 100644 index 0000000..cee98e7 --- /dev/null +++ b/devstack/lib/docker @@ -0,0 +1,106 @@ +#!/bin/bash + +# Dependencies: +# +# - functions +# - ``STACK_USER`` must be defined +# - ``ETCD_PORT`` must be defined if on swarm mode + +# stack.sh +# --------- +# - install_docker + +# Save trace setting +_XTRACE_DOCKER=$(set +o | grep xtrace) +set +o xtrace + + +# Defaults +# -------- + +DOCKER_ENGINE_SOCKET_FILE=${DOCKER_ENGINE_SOCKET_FILE:-/var/run/docker.sock} +DOCKER_ENGINE_PORT=${DOCKER_ENGINE_PORT:-2375} +SWARM_MODE=$(trueorfalse False SWARM_MODE) + + +# Functions +# --------- + +function check_docker { + if is_ubuntu; then + dpkg -s docker-engine > /dev/null 2>&1 || dpkg -s docker-ce > /dev/null 2>&1 + else + rpm -q docker-engine > /dev/null 2>&1 || rpm -q docker > /dev/null 2>&1 || rpm -q docker-ce > /dev/null 2>&1 + fi +} + +function install_docker { + if [[ -z "$os_PACKAGE" ]]; then + GetOSVersion + fi + + local lsb_dist=${os_VENDOR,,} + local dist_version=${os_CODENAME} + local arch=$(dpkg --print-architecture) + if is_ubuntu; then + apt_get install linux-image-extra-$(uname -r) linux-image-extra-virtual + curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - + sudo add-apt-repository -y \ + "deb [arch=${arch}] https://download.docker.com/linux/${lsb_dist} \ + ${dist_version} \ + stable" + REPOS_UPDATED=False apt_get_update + apt_get install docker-ce + elif is_fedora; then + if [[ "$lsb_dist" = "centos" ]]; then + sudo yum-config-manager \ + --add-repo \ + https://download.docker.com/linux/centos/docker-ce.repo + elif [[ "$lsb_dist" = "fedora" ]]; then + sudo dnf config-manager \ + --add-repo \ + https://download.docker.com/linux/fedora/docker-ce.repo + fi + yum_install docker-ce + fi +} + +function configure_docker { + # After an ./unstack it will be stopped. So it is ok if it returns exit-code == 1 + sudo systemctl stop docker.service || true + + local cluster_store_opts="" + if [[ "$SWARM_MODE" = "True" ]]; then + cluster_store_opts+="\"cluster-store\": \"etcd://localhost:$ETCD_PORT\"," + fi + local docker_config_file=/etc/docker/daemon.json + sudo mkdir -p $(dirname ${docker_config_file}) + cat </dev/null +{ + $cluster_store_opts + "group": "$STACK_USER", + "hosts": [ + "unix://$DOCKER_ENGINE_SOCKET_FILE", + "tcp://0.0.0.0:$DOCKER_ENGINE_PORT" + ] +} +EOF + # NOTE(hongbin): We override ExecStart to workaround issue 22339. + # https://github.com/docker/docker/issues/22339 + local docker_drop_in_file=/etc/systemd/system/docker.service.d/docker.conf + sudo mkdir -p $(dirname ${docker_drop_in_file}) + cat </dev/null +[Service] +ExecStart= +ExecStart=/usr/bin/dockerd --config-file=$docker_config_file +EOF + sudo systemctl daemon-reload + sudo systemctl --no-block restart docker.service +} + +function stop_docker { + sudo systemctl stop docker.service || true +} + +# Restore xtrace +$_XTRACE_DOCKER diff --git a/devstack/plugin.sh b/devstack/plugin.sh new file mode 100644 index 0000000..48d8bfd --- /dev/null +++ b/devstack/plugin.sh @@ -0,0 +1,37 @@ +# container - Devstack extras script to install container engine + +# Save trace setting +XTRACE=$(set +o | grep xtrace) +set -o xtrace + +echo_summary "container's plugin.sh was called..." +source $DEST/devstack-plugin-container/devstack/lib/docker +(set -o posix; set) + +if is_service_enabled container; then + if [[ "$1" == "stack" && "$2" == "install" ]]; then + echo_summary "Installing container engine" + if [[ ${CONTAINER_ENGINE} == "docker" ]]; then + check_docker || install_docker + fi + elif [[ "$1" == "stack" && "$2" == "post-config" ]]; then + echo_summary "Configuring container engine" + if [[ ${CONTAINER_ENGINE} == "docker" ]]; then + configure_docker + fi + fi + + if [[ "$1" == "unstack" ]]; then + if [[ ${CONTAINER_ENGINE} == "docker" ]]; then + stop_docker + fi + fi + + if [[ "$1" == "clean" ]]; then + # nothing needed here + : + fi +fi + +# Restore xtrace +$XTRACE diff --git a/devstack/settings b/devstack/settings new file mode 100644 index 0000000..4c9dacc --- /dev/null +++ b/devstack/settings @@ -0,0 +1,6 @@ +# Devstack settings + +CONTAINER_ENGINE=${CONTAINER_ENGINE:-docker} + +# Enable container services +enable_service container