Merge pull request #155 from dokku/191-network-support

Add custom network support
This commit is contained in:
josegonzalez
2023-02-07 19:51:59 -05:00
committed by GitHub
8 changed files with 143 additions and 9 deletions

View File

@@ -44,6 +44,7 @@ mysql:logs <service> [-t|--tail] <tail-num-optional> # print the most recent log
mysql:pause <service> # pause a running mysql service
mysql:promote <service> <app> # promote service <service> as DATABASE_URL in <app>
mysql:restart <service> # graceful shutdown and restart of the mysql service container
mysql:set <service> <key> <value> # set or clear a property for a service
mysql:start <service> # start a previously stopped mysql service
mysql:stop <service> # stop a running mysql service
mysql:unexpose <service> # unexpose a previously exposed mysql 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 mysql:info lollipop --dsn
dokku mysql:info lollipop --exposed-ports
dokku mysql:info lollipop --id
dokku mysql:info lollipop --internal-ip
dokku mysql:info lollipop --initial-network
dokku mysql:info lollipop --links
dokku mysql:info lollipop --post-create-network
dokku mysql:info lollipop --post-start-network
dokku mysql:info lollipop --service-root
dokku mysql:info lollipop --status
dokku mysql:info lollipop --version
@@ -250,6 +257,31 @@ You can unlink a mysql service:
dokku mysql:unlink lollipop playground
```
### set or clear a property for a service
```shell
# usage
dokku mysql:set <service> <key> <value>
```
Set the network to attach after the service container is started:
```shell
dokku mysql:set lollipop post-create-network custom-network
```
Set multiple networks:
```shell
dokku mysql:set lollipop post-create-network custom-network,other-network
```
Unset the post-create-network value:
```shell
dokku mysql:set lollipop post-create-network
```
### Service Lifecycle
The lifecycle of each service can be managed through the following commands:

View File

@@ -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(

View File

@@ -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

View File

@@ -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")"

View File

@@ -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"
@@ -84,25 +85,70 @@ 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+=("--env=MYSQL_DATABASE=$DATABASE_NAME")
DOCKER_ARGS+=("--env=MYSQL_PASSWORD=$PASSWORD")
DOCKER_ARGS+=("--env=MYSQL_ROOT_PASSWORD=$ROOTPASSWORD")
DOCKER_ARGS+=("--env=MYSQL_USER=mysql")
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:/etc/mysql/conf.d")
DOCKER_ARGS+=("--volume=$SERVICE_HOST_ROOT/data:/var/lib/mysql")
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:/var/lib/mysql" -v "$SERVICE_HOST_ROOT/$PLUGIN_CONFIG_SUFFIX:/etc/mysql/conf.d" -e "MYSQL_ROOT_PASSWORD=$ROOTPASSWORD" -e MYSQL_USER=mysql -e "MYSQL_PASSWORD=$PASSWORD" -e "MYSQL_DATABASE=$DATABASE_NAME" --env-file="$SERVICE_ROOT/ENV" -d --restart always --label dokku=service --label dokku.service=mysql "$PLUGIN_IMAGE:$PLUGIN_IMAGE_VERSION" $CONFIG_OPTIONS)
echo "$ID" >"$SERVICE_ROOT/ID"
"$DOCKER_BIN" container create "${DOCKER_ARGS[@]}" "$PLUGIN_IMAGE:$PLUGIN_IMAGE_VERSION" $CONFIG_OPTIONS >/dev/null
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
"$DOCKER_BIN" container start "$(cat "$SERVICE_ROOT/ID")" >/dev/null
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"

View File

@@ -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

View File

@@ -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
View 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 "$@"