From deb9317edf6b107578b5516abbe6985d3b854620 Mon Sep 17 00:00:00 2001 From: Jody McIntyre Date: Thu, 29 Mar 2018 16:52:38 -0400 Subject: [PATCH] Support a separate data root for Docker binds We run Dokku, and therefore dokku redis, in its own Docker container. In order to make this work we map a path from the host into the container as `/var/lib/dokku/services/redis`. Unfortunately the path on the host is user-configurable, and generally _won't_ be the same as the path in the container. This means that when we run `docker` commands (e.g. to spin up Redis containers), the directory used for bind mounts (the `-v` option) needs to be different. This commit allows us to do this, but keeps the existing behaviour (the redis root for Docker binds is the same as the redis root for other uses) by default. --- config | 2 ++ functions | 7 ++++--- subcommands/destroy | 3 ++- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/config b/config index baeaff0..1bc1685 100755 --- a/config +++ b/config @@ -2,10 +2,12 @@ export REDIS_IMAGE=${REDIS_IMAGE:="redis"} export REDIS_IMAGE_VERSION=${REDIS_IMAGE_VERSION:="4.0.8"} export REDIS_ROOT=${REDIS_ROOT:="/var/lib/dokku/services/redis"} +export REDIS_HOST_ROOT=${REDIS_HOST_ROOT:=$REDIS_ROOT} export PLUGIN_COMMAND_PREFIX="redis" export PLUGIN_CONFIG_ROOT=${PLUGIN_CONFIG_ROOT:="$DOKKU_LIB_ROOT/config/$PLUGIN_COMMAND_PREFIX"} export PLUGIN_DATA_ROOT=$REDIS_ROOT +export PLUGIN_DATA_HOST_ROOT=$REDIS_HOST_ROOT export PLUGIN_DATASTORE_PORTS=(6379) export PLUGIN_DATASTORE_WAIT_PORT=6379 export PLUGIN_DEFAULT_ALIAS="REDIS" diff --git a/functions b/functions index 1b2ac21..239afd3 100755 --- a/functions +++ b/functions @@ -63,9 +63,10 @@ service_create() { service_create_container() { local SERVICE="$1" local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" + local SERVICE_HOST_ROOT="$PLUGIN_DATA_HOST_ROOT/$SERVICE" local SERVICE_NAME="$(get_service_name "$SERVICE")" - ID=$(docker run --name "$SERVICE_NAME" -v "$SERVICE_ROOT/data:/data" -v "$SERVICE_ROOT/config:/usr/local/etc/redis" --env-file="$SERVICE_ROOT/ENV" -d --restart always --label dokku=service --label dokku.service=redis "$PLUGIN_IMAGE:$PLUGIN_IMAGE_VERSION" redis-server /usr/local/etc/redis/redis.conf --bind 0.0.0.0) + ID=$(docker run --name "$SERVICE_NAME" -v "$SERVICE_HOST_ROOT/data:/data" -v "$SERVICE_HOST_ROOT/config:/usr/local/etc/redis" --env-file="$SERVICE_ROOT/ENV" -d --restart always --label dokku=service --label dokku.service=redis "$PLUGIN_IMAGE:$PLUGIN_IMAGE_VERSION" redis-server /usr/local/etc/redis/redis.conf --bind 0.0.0.0) echo "$ID" > "$SERVICE_ROOT/ID" dokku_log_verbose_quiet "Waiting for container to be ready" @@ -91,14 +92,14 @@ service_export() { service_import() { local SERVICE="$1" - SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE" + SERVICE_HOST_ROOT="$PLUGIN_DATA_HOST_ROOT/$SERVICE" SERVICE_NAME="$(get_service_name "$SERVICE")" if [[ -t 0 ]]; then dokku_log_fail "No data provided on stdin." fi dokku "$PLUGIN_COMMAND_PREFIX:stop" "$SERVICE" > /dev/null 2>&1 - docker run --rm -i -v "$SERVICE_ROOT/data:/data" "$PLUGIN_IMAGE:$PLUGIN_IMAGE_VERSION" bash -c "cat > /data/dump.rdb && chown redis: /data/dump.rdb" + docker run --rm -i -v "$SERVICE_HOST_ROOT/data:/data" "$PLUGIN_IMAGE:$PLUGIN_IMAGE_VERSION" bash -c "cat > /data/dump.rdb && chown redis: /data/dump.rdb" dokku "$PLUGIN_COMMAND_PREFIX:start" "$SERVICE" > /dev/null 2>&1 } diff --git a/subcommands/destroy b/subcommands/destroy index abdbc65..a022b9b 100755 --- a/subcommands/destroy +++ b/subcommands/destroy @@ -16,6 +16,7 @@ service-destroy-cmd() { [[ -z "$SERVICE" ]] && dokku_log_fail "Please specify a name for the service" verify_service_name "$SERVICE" SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE"; LINKS_FILE="$SERVICE_ROOT/LINKS" + SERVICE_HOST_ROOT="$PLUGIN_DATA_HOST_ROOT/$SERVICE" SERVICE_NAME="$(get_service_name "$SERVICE")" [[ -s "$LINKS_FILE" ]] && dokku_log_fail "Cannot delete linked service" @@ -50,7 +51,7 @@ service-destroy-cmd() { fi dokku_log_verbose_quiet "Removing data" - docker run --rm -v "$SERVICE_ROOT/data:/data" -v "$SERVICE_ROOT/config:/config" "$PLUGIN_IMAGE:$PLUGIN_IMAGE_VERSION" chmod 777 -R /config /data + docker run --rm -v "$SERVICE_HOST_ROOT/data:/data" -v "$SERVICE_HOST_ROOT/config:/config" "$PLUGIN_IMAGE:$PLUGIN_IMAGE_VERSION" chmod 777 -R /config /data rm -rf "$SERVICE_ROOT" dokku_log_info2 "$PLUGIN_SERVICE container deleted: $SERVICE"