#!/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" } # Emits the identifier of the container this job is executing in, or an empty string when the job # runs directly on a host. This is the single topology signal: harnesses that provision their own # containers instead of a Compose project (the TLS integration suite) consume it through the # environment rather than re-deriving the topology, so there is exactly one detector. compose_job_network_job_container() { if [[ "$COMPOSE_JOB_NETWORK_RUNNING_IN_CONTAINER" != "true" ]]; then return 0 fi printf '%s' "$COMPOSE_JOB_NETWORK_CURRENT_CONTAINER" } 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 }