113 lines
2.9 KiB
Bash
113 lines
2.9 KiB
Bash
#!/usr/bin/env bash
|
|
|
|
COMPOSE_JOB_NETWORK_RUNNING_IN_CONTAINER=false
|
|
COMPOSE_JOB_NETWORK_CURRENT_CONTAINER=""
|
|
COMPOSE_JOB_NETWORK_NAME=""
|
|
COMPOSE_JOB_NETWORK_CONNECTED=false
|
|
|
|
compose_job_network_initialize() {
|
|
COMPOSE_JOB_NETWORK_RUNNING_IN_CONTAINER=false
|
|
COMPOSE_JOB_NETWORK_CURRENT_CONTAINER=""
|
|
COMPOSE_JOB_NETWORK_NAME=""
|
|
COMPOSE_JOB_NETWORK_CONNECTED=false
|
|
|
|
if [[ ! -f /.dockerenv ]]; then
|
|
return 0
|
|
fi
|
|
if [[ -z "${HOSTNAME:-}" ]]; then
|
|
return 1
|
|
fi
|
|
|
|
COMPOSE_JOB_NETWORK_RUNNING_IN_CONTAINER=true
|
|
COMPOSE_JOB_NETWORK_CURRENT_CONTAINER="$HOSTNAME"
|
|
}
|
|
|
|
compose_job_network_connect() {
|
|
if [[ "$COMPOSE_JOB_NETWORK_RUNNING_IN_CONTAINER" != "true" ]]; then
|
|
return 1
|
|
fi
|
|
if (($# == 0)); then
|
|
return 1
|
|
fi
|
|
local service="$1"
|
|
shift
|
|
if [[ -z "$service" || $# -eq 0 ]]; then
|
|
return 1
|
|
fi
|
|
|
|
local service_container_output
|
|
if ! service_container_output="$("$@" ps -q "$service" 2>/dev/null)"; then
|
|
return 1
|
|
fi
|
|
|
|
local service_containers=()
|
|
while IFS= read -r container_id; do
|
|
if [[ -n "$container_id" ]]; then
|
|
service_containers+=("$container_id")
|
|
fi
|
|
done <<<"$service_container_output"
|
|
if ((${#service_containers[@]} != 1)); then
|
|
return 1
|
|
fi
|
|
|
|
local service_network_output
|
|
if ! service_network_output="$(
|
|
docker inspect \
|
|
--format '{{range $networkName, $_ := .NetworkSettings.Networks}}{{println $networkName}}{{end}}' \
|
|
"${service_containers[0]}" 2>/dev/null
|
|
)"; then
|
|
return 1
|
|
fi
|
|
|
|
local service_networks=()
|
|
while IFS= read -r network_name; do
|
|
if [[ -n "$network_name" ]]; then
|
|
service_networks+=("$network_name")
|
|
fi
|
|
done <<<"$service_network_output"
|
|
if ((${#service_networks[@]} != 1)); then
|
|
return 1
|
|
fi
|
|
COMPOSE_JOB_NETWORK_NAME="${service_networks[0]}"
|
|
|
|
local current_network_output
|
|
if ! current_network_output="$(
|
|
docker inspect \
|
|
--format '{{range $networkName, $_ := .NetworkSettings.Networks}}{{println $networkName}}{{end}}' \
|
|
"$COMPOSE_JOB_NETWORK_CURRENT_CONTAINER" 2>/dev/null
|
|
)"; then
|
|
return 1
|
|
fi
|
|
|
|
while IFS= read -r network_name; do
|
|
if [[ "$network_name" == "$COMPOSE_JOB_NETWORK_NAME" ]]; then
|
|
COMPOSE_JOB_NETWORK_CONNECTED=true
|
|
return 0
|
|
fi
|
|
done <<<"$current_network_output"
|
|
|
|
COMPOSE_JOB_NETWORK_CONNECTED=true
|
|
if ! docker network connect \
|
|
"$COMPOSE_JOB_NETWORK_NAME" \
|
|
"$COMPOSE_JOB_NETWORK_CURRENT_CONTAINER" >/dev/null 2>&1; then
|
|
docker network disconnect \
|
|
"$COMPOSE_JOB_NETWORK_NAME" \
|
|
"$COMPOSE_JOB_NETWORK_CURRENT_CONTAINER" >/dev/null 2>&1 || true
|
|
COMPOSE_JOB_NETWORK_CONNECTED=false
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
compose_job_network_disconnect() {
|
|
if [[ "$COMPOSE_JOB_NETWORK_CONNECTED" != "true" ]]; then
|
|
return 0
|
|
fi
|
|
|
|
if ! docker network disconnect \
|
|
"$COMPOSE_JOB_NETWORK_NAME" \
|
|
"$COMPOSE_JOB_NETWORK_CURRENT_CONTAINER" >/dev/null 2>&1; then
|
|
return 1
|
|
fi
|
|
COMPOSE_JOB_NETWORK_CONNECTED=false
|
|
}
|