Merge pull request #202 from dokku/191-network-support
Add custom network support
This commit is contained in:
32
README.md
32
README.md
@@ -44,6 +44,7 @@ redis:logs <service> [-t|--tail] <tail-num-optional> # print the most recent log
|
||||
redis:pause <service> # pause a running redis service
|
||||
redis:promote <service> <app> # promote service <service> as REDIS_URL in <app>
|
||||
redis:restart <service> # graceful shutdown and restart of the redis service container
|
||||
redis:set <service> <key> <value> # set or clear a property for a service
|
||||
redis:start <service> # start a previously stopped redis service
|
||||
redis:stop <service> # stop a running redis service
|
||||
redis:unexpose <service> # unexpose a previously exposed redis service
|
||||
@@ -111,7 +112,10 @@ flags:
|
||||
- `--exposed-ports`: show service exposed ports
|
||||
- `--id`: show the service container id
|
||||
- `--internal-ip`: show the service internal ip
|
||||
- `--initial-network`: show the initial network being connected to
|
||||
- `--links`: show the service app links
|
||||
- `--post-create-network`: show the networks to attach to after service container creation
|
||||
- `--post-start-network`: show the networks to attach to after service container start
|
||||
- `--service-root`: show the service root directory
|
||||
- `--status`: show the service running status
|
||||
- `--version`: show the service image version
|
||||
@@ -131,7 +135,10 @@ dokku redis:info lollipop --dsn
|
||||
dokku redis:info lollipop --exposed-ports
|
||||
dokku redis:info lollipop --id
|
||||
dokku redis:info lollipop --internal-ip
|
||||
dokku redis:info lollipop --initial-network
|
||||
dokku redis:info lollipop --links
|
||||
dokku redis:info lollipop --post-create-network
|
||||
dokku redis:info lollipop --post-start-network
|
||||
dokku redis:info lollipop --service-root
|
||||
dokku redis:info lollipop --status
|
||||
dokku redis:info lollipop --version
|
||||
@@ -250,6 +257,31 @@ You can unlink a redis service:
|
||||
dokku redis:unlink lollipop playground
|
||||
```
|
||||
|
||||
### set or clear a property for a service
|
||||
|
||||
```shell
|
||||
# usage
|
||||
dokku redis:set <service> <key> <value>
|
||||
```
|
||||
|
||||
Set the network to attach after the service container is started:
|
||||
|
||||
```shell
|
||||
dokku redis:set lollipop post-create-network custom-network
|
||||
```
|
||||
|
||||
Set multiple networks:
|
||||
|
||||
```shell
|
||||
dokku redis:set lollipop post-create-network custom-network,other-network
|
||||
```
|
||||
|
||||
Unset the post-create-network value:
|
||||
|
||||
```shell
|
||||
dokku redis:set lollipop post-create-network
|
||||
```
|
||||
|
||||
### Service Lifecycle
|
||||
|
||||
The lifecycle of each service can be managed through the following commands:
|
||||
|
||||
@@ -131,7 +131,7 @@ def usage_section(service, variable, alias, image, scheme, ports, options, unimp
|
||||
|
||||
|
||||
def usage_intro(service, variable, alias, image, scheme, ports, options, unimplemented):
|
||||
commands = ["create", "info", "list", "logs", "link", "unlink"]
|
||||
commands = ["create", "info", "list", "logs", "link", "unlink", "set"]
|
||||
content = ["### Basic Usage"]
|
||||
|
||||
return fetch_commands_content(
|
||||
|
||||
3
commands
3
commands
@@ -1,7 +1,8 @@
|
||||
#!/usr/bin/env bash
|
||||
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/config"
|
||||
[[ " help $PLUGIN_COMMAND_PREFIX:help $PLUGIN_COMMAND_PREFIX $PLUGIN_COMMAND_PREFIX:default " == *" $1 "* ]] || [[ "$1" == "$PLUGIN_COMMAND_PREFIX:"* ]] || exit "$DOKKU_NOT_IMPLEMENTED_EXIT"
|
||||
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
|
||||
source "$PLUGIN_BASE_PATH/common/functions"
|
||||
|
||||
set -eo pipefail
|
||||
[[ $DOKKU_TRACE ]] && set -x
|
||||
|
||||
|
||||
@@ -539,7 +539,10 @@ service_info() {
|
||||
"--exposed-ports: $(service_exposed_ports "$SERVICE")"
|
||||
"--id: ${SERVICE_CONTAINER_ID}"
|
||||
"--internal-ip: $(get_container_ip "${SERVICE_CONTAINER_ID}")"
|
||||
"--initial-network: $(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "initial-network")"
|
||||
"--links: $(service_linked_apps "$SERVICE")"
|
||||
"--post-create-network: $(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "post-create-network")"
|
||||
"--post-start-network: $(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "post-start-network")"
|
||||
"--service-root: ${SERVICE_ROOT}"
|
||||
"--status: $(service_status "$SERVICE")"
|
||||
"--version: $(service_version "$SERVICE")"
|
||||
|
||||
58
functions
58
functions
@@ -3,7 +3,8 @@ source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/config"
|
||||
set -eo pipefail
|
||||
[[ $DOKKU_TRACE ]] && set -x
|
||||
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/common-functions"
|
||||
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
|
||||
source "$PLUGIN_BASE_PATH/common/functions"
|
||||
source "$PLUGIN_BASE_PATH/common/property-functions"
|
||||
source "$PLUGIN_AVAILABLE_PATH/config/functions"
|
||||
if [[ -f "$PLUGIN_AVAILABLE_PATH/docker-options/functions" ]]; then
|
||||
source "$PLUGIN_AVAILABLE_PATH/docker-options/functions"
|
||||
@@ -77,25 +78,66 @@ service_create_container() {
|
||||
export CONFIG_OPTIONS="$(cat "$SERVICE_ROOT/CONFIG_OPTIONS")"
|
||||
fi
|
||||
|
||||
rm -f "$SERVICE_ROOT/ID"
|
||||
declare -a DOCKER_ARGS
|
||||
DOCKER_ARGS=()
|
||||
DOCKER_ARGS+=("--cidfile=$SERVICE_ROOT/ID")
|
||||
DOCKER_ARGS+=("--env-file=$SERVICE_ROOT/ENV")
|
||||
DOCKER_ARGS+=("--hostname=$SERVICE")
|
||||
DOCKER_ARGS+=("--label=dokku.service=$PLUGIN_COMMAND_PREFIX")
|
||||
DOCKER_ARGS+=("--label=dokku=service")
|
||||
DOCKER_ARGS+=("--name=$SERVICE_NAME")
|
||||
DOCKER_ARGS+=("--restart=always")
|
||||
DOCKER_ARGS+=("--volume=$SERVICE_HOST_ROOT/$PLUGIN_CONFIG_SUFFIX:/usr/local/etc/redis")
|
||||
DOCKER_ARGS+=("--volume=$SERVICE_HOST_ROOT/data:/data")
|
||||
|
||||
declare -a LINK_CONTAINER_DOCKER_ARGS
|
||||
LINK_CONTAINER_DOCKER_ARGS=()
|
||||
LINK_CONTAINER_DOCKER_ARGS+=("--rm")
|
||||
LINK_CONTAINER_DOCKER_ARGS+=("--link")
|
||||
LINK_CONTAINER_DOCKER_ARGS+=("$SERVICE_NAME:$PLUGIN_COMMAND_PREFIX")
|
||||
|
||||
[[ -f "$SERVICE_ROOT/SERVICE_MEMORY" ]] && SERVICE_MEMORY="$(cat "$SERVICE_ROOT/SERVICE_MEMORY")"
|
||||
if [[ -n "$SERVICE_MEMORY" ]]; then
|
||||
MEMORY_LIMIT="--memory=${SERVICE_MEMORY}m"
|
||||
DOCKER_ARGS+=("--memory=${SERVICE_MEMORY}m")
|
||||
fi
|
||||
|
||||
[[ -f "$SERVICE_ROOT/SHM_SIZE" ]] && SERVICE_SHM_SIZE="$(cat "$SERVICE_ROOT/SHM_SIZE")"
|
||||
if [[ -n "$SERVICE_SHM_SIZE" ]]; then
|
||||
SHM_SIZE="--shm-size=${SERVICE_SHM_SIZE}"
|
||||
DOCKER_ARGS+=("--shm-size=${SERVICE_SHM_SIZE}")
|
||||
fi
|
||||
|
||||
[[ -f "$SERVICE_ROOT/IMAGE" ]] && PLUGIN_IMAGE="$(cat "$SERVICE_ROOT/IMAGE")"
|
||||
[[ -f "$SERVICE_ROOT/IMAGE_VERSION" ]] && PLUGIN_IMAGE_VERSION="$(cat "$SERVICE_ROOT/IMAGE_VERSION")"
|
||||
|
||||
local network="$(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "initial-network")"
|
||||
if [[ -n "$network" ]]; then
|
||||
DOCKER_ARGS+=("--network=${network}")
|
||||
DOCKER_ARGS+=("--network-alias=$SERVICE_NAME")
|
||||
LINK_CONTAINER_DOCKER_ARGS+=("--network=${network}")
|
||||
fi
|
||||
|
||||
# shellcheck disable=SC2086
|
||||
ID=$("$DOCKER_BIN" container run --name "$SERVICE_NAME" $MEMORY_LIMIT $SHM_SIZE -v "$SERVICE_HOST_ROOT/data:/data" -v "$SERVICE_HOST_ROOT/$PLUGIN_CONFIG_SUFFIX:/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 $CONFIG_OPTIONS)
|
||||
echo "$ID" >"$SERVICE_ROOT/ID"
|
||||
suppress_output "$DOCKER_BIN" container create "${DOCKER_ARGS[@]}" "$PLUGIN_IMAGE:$PLUGIN_IMAGE_VERSION" redis-server /usr/local/etc/redis/redis.conf --bind 0.0.0.0 $CONFIG_OPTIONS
|
||||
|
||||
if [[ -n "$(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "post-create-network")" ]]; then
|
||||
dokku_log_verbose_quiet "Connecting to networks after container create"
|
||||
while read -r line || [[ -n "$line" ]]; do
|
||||
dokku_log_verbose_quiet "- $line"
|
||||
"$DOCKER_BIN" network connect --alias "$SERVICE_NAME" "$line" "$SERVICE_NAME"
|
||||
done < <(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "post-create-network" | tr "," "\n")
|
||||
fi
|
||||
suppress_output "$DOCKER_BIN" container start "$(cat "$SERVICE_ROOT/ID")"
|
||||
if [[ -n "$(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "post-start-network")" ]]; then
|
||||
dokku_log_verbose_quiet "Connecting to networks after container start"
|
||||
while read -r line || [[ -n "$line" ]]; do
|
||||
dokku_log_verbose_quiet "- $line"
|
||||
"$DOCKER_BIN" network connect --alias "$SERVICE_NAME" "$line" "$SERVICE_NAME"
|
||||
done < <(fn-plugin-property-get "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "post-start-network" | tr "," "\n")
|
||||
fi
|
||||
|
||||
dokku_log_verbose_quiet "Waiting for container to be ready"
|
||||
"$DOCKER_BIN" container run --rm --link "$SERVICE_NAME:$PLUGIN_COMMAND_PREFIX" "$PLUGIN_WAIT_IMAGE" -p "$PLUGIN_DATASTORE_WAIT_PORT" >/dev/null
|
||||
"$DOCKER_BIN" container run "${LINK_CONTAINER_DOCKER_ARGS[@]}" "$PLUGIN_WAIT_IMAGE" -c "$SERVICE_NAME:$PLUGIN_DATASTORE_WAIT_PORT" >/dev/null
|
||||
|
||||
dokku_log_info2 "$PLUGIN_SERVICE container created: $SERVICE"
|
||||
service_info "$SERVICE"
|
||||
@@ -131,9 +173,9 @@ service_import() {
|
||||
if [[ -t 0 ]]; then
|
||||
dokku_log_fail "No data provided on stdin."
|
||||
fi
|
||||
dokku "$PLUGIN_COMMAND_PREFIX:stop" "$SERVICE" >/dev/null 2>&1
|
||||
suppress_output service_container_rm "$SERVICE"
|
||||
"$DOCKER_BIN" container 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
|
||||
suppress_output service_start "$SERVICE"
|
||||
}
|
||||
|
||||
service_start() {
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
#!/usr/bin/env bash
|
||||
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
|
||||
source "$PLUGIN_BASE_PATH/common/functions"
|
||||
|
||||
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/config"
|
||||
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/functions"
|
||||
set -eo pipefail
|
||||
|
||||
@@ -15,7 +15,10 @@ service-info-cmd() {
|
||||
#E dokku $PLUGIN_COMMAND_PREFIX:info lollipop --exposed-ports
|
||||
#E dokku $PLUGIN_COMMAND_PREFIX:info lollipop --id
|
||||
#E dokku $PLUGIN_COMMAND_PREFIX:info lollipop --internal-ip
|
||||
#E dokku $PLUGIN_COMMAND_PREFIX:info lollipop --initial-network
|
||||
#E dokku $PLUGIN_COMMAND_PREFIX:info lollipop --links
|
||||
#E dokku $PLUGIN_COMMAND_PREFIX:info lollipop --post-create-network
|
||||
#E dokku $PLUGIN_COMMAND_PREFIX:info lollipop --post-start-network
|
||||
#E dokku $PLUGIN_COMMAND_PREFIX:info lollipop --service-root
|
||||
#E dokku $PLUGIN_COMMAND_PREFIX:info lollipop --status
|
||||
#E dokku $PLUGIN_COMMAND_PREFIX:info lollipop --version
|
||||
@@ -26,7 +29,10 @@ service-info-cmd() {
|
||||
#F --exposed-ports, show service exposed ports
|
||||
#F --id, show the service container id
|
||||
#F --internal-ip, show the service internal ip
|
||||
#F --initial-network, show the initial network being connected to
|
||||
#F --links, show the service app links
|
||||
#F --post-create-network, show the networks to attach to after service container creation
|
||||
#F --post-start-network, show the networks to attach to after service container start
|
||||
#F --service-root, show the service root directory
|
||||
#F --status, show the service running status
|
||||
#F --version, show the service image version
|
||||
|
||||
45
subcommands/set
Executable file
45
subcommands/set
Executable file
@@ -0,0 +1,45 @@
|
||||
#!/usr/bin/env bash
|
||||
source "$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")/config"
|
||||
set -eo pipefail
|
||||
[[ $DOKKU_TRACE ]] && set -x
|
||||
source "$PLUGIN_BASE_PATH/common/functions"
|
||||
source "$PLUGIN_BASE_PATH/common/property-functions"
|
||||
source "$(cd "$(dirname "$(dirname "${BASH_SOURCE[0]}")")" && pwd)/common-functions"
|
||||
|
||||
service-set-cmd() {
|
||||
#E set the network to attach after the service container is started
|
||||
#E dokku $PLUGIN_COMMAND_PREFIX:set lollipop post-create-network custom-network
|
||||
#E set multiple networks
|
||||
#E dokku $PLUGIN_COMMAND_PREFIX:set lollipop post-create-network custom-network,other-network
|
||||
#E unset the post-create-network value
|
||||
#E dokku $PLUGIN_COMMAND_PREFIX:set lollipop post-create-network
|
||||
#A service, service to run command against
|
||||
#A key, property name to set
|
||||
#A value, optional property value to set or empty to unset key
|
||||
declare desc="set or clear a property for a service"
|
||||
local cmd="$PLUGIN_COMMAND_PREFIX:set" argv=("$@")
|
||||
[[ ${argv[0]} == "$cmd" ]] && shift 1
|
||||
declare SERVICE="$1" KEY="$2" VALUE="$3"
|
||||
local VALID_KEYS=("initial-network" "post-create-network" "post-start-network")
|
||||
verify_service_name "$SERVICE"
|
||||
|
||||
[[ -z "$KEY" ]] && dokku_log_fail "No key specified"
|
||||
|
||||
if ! fn-in-array "$KEY" "${VALID_KEYS[@]}"; then
|
||||
dokku_log_fail "Invalid key specified, valid keys include: initial-network, post-create-network, post-start-network"
|
||||
fi
|
||||
|
||||
if [[ -n "$VALUE" ]]; then
|
||||
dokku_log_info2_quiet "Setting ${KEY} to ${VALUE}"
|
||||
fn-plugin-property-write "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "$KEY" "$VALUE"
|
||||
else
|
||||
dokku_log_info2_quiet "Unsetting ${KEY}"
|
||||
if [[ "$KEY" == "rev-env-var" ]]; then
|
||||
fn-plugin-property-write "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "$KEY" "$VALUE"
|
||||
else
|
||||
fn-plugin-property-delete "$PLUGIN_COMMAND_PREFIX" "$SERVICE" "$KEY"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
service-set-cmd "$@"
|
||||
@@ -33,7 +33,7 @@ teardown() {
|
||||
}
|
||||
|
||||
@test "($PLUGIN_COMMAND_PREFIX:import) success" {
|
||||
run dokku "$PLUGIN_COMMAND_PREFIX:import" l <"/tmp/fake.rdb"
|
||||
run dokku --trace "$PLUGIN_COMMAND_PREFIX:import" l <"/tmp/fake.rdb"
|
||||
echo "output: $output"
|
||||
echo "status: $status"
|
||||
assert_success
|
||||
|
||||
Reference in New Issue
Block a user