#!/usr/bin/env bash set -euo pipefail APP_NAME="" TAG="" PORT="" INTERNAL_PORT="80" ENV="" ENV_OVERRIDE="" while [[ $# -gt 0 ]]; do case $1 in --name) APP_NAME="$2"; shift 2 ;; --tag) TAG="$2"; shift 2 ;; --port) PORT="$2"; shift 2 ;; --internal-port) INTERNAL_PORT="$2";shift 2 ;; --env) ENV="$2"; shift 2 ;; --env-override) ENV_OVERRIDE="$2"; shift 2 ;; *) echo "Unknown arg: $1"; exit 1 ;; esac done CONTAINER="${APP_NAME}-${TAG}" ON_DISK="/opt/apps/${APP_NAME}/.env.${ENV}" echo "→ Deploying container: ${CONTAINER} on port ${PORT}" docker stop "${CONTAINER}" 2>/dev/null && docker rm "${CONTAINER}" 2>/dev/null || true ENV_FILE_ARG="" HAS_ON_DISK=0 HAS_OVERRIDE=0 [[ -f "${ON_DISK}" ]] && HAS_ON_DISK=1 [[ -n "${ENV_OVERRIDE}" && -f "${ENV_OVERRIDE}" ]] && HAS_OVERRIDE=1 if (( HAS_ON_DISK == 1 && HAS_OVERRIDE == 0 )); then ENV_FILE_ARG="--env-file ${ON_DISK}" elif (( HAS_OVERRIDE == 1 && HAS_ON_DISK == 0 )); then ENV_FILE_ARG="--env-file ${ENV_OVERRIDE}" elif (( HAS_ON_DISK == 1 && HAS_OVERRIDE == 1 )); then MERGED=$(mktemp) # On-disk first, override second; tac/awk/tac keeps the last occurrence per key. { cat "${ON_DISK}"; echo; cat "${ENV_OVERRIDE}"; } \ | grep -Ev '^[[:space:]]*(#|$)' \ | tac | awk -F= '!seen[$1]++' | tac \ > "${MERGED}" ENV_FILE_ARG="--env-file ${MERGED}" fi docker run -d \ --name "${CONTAINER}" \ --restart unless-stopped \ -p "0.0.0.0:${PORT}:${INTERNAL_PORT}" \ -e NODE_ENV=production \ -e PORT="${INTERNAL_PORT}" \ ${ENV_FILE_ARG} \ "${APP_NAME}:${TAG}" echo "✓ Container ${CONTAINER} running on 0.0.0.0:${PORT}"