#!/usr/bin/env bash EASY_DOCKER_BUILD_ERROR_DETAIL="" # shellcheck disable=SC2034 # Read by manage flow after start_stack_with_compose_from_metadata fails. EASY_DOCKER_COMPOSE_ERROR_DETAIL="" render_stack_compose_from_metadata() { local stack_dir="${1}" local metadata_path="" local env_path="" local generated_compose_path="" local generated_compose_tmp_path="" local compose_files_lines="" local compose_file="" local source_compose_path="" local env_erpnext_version="" local fallback_erpnext_version="" local repo_root="" local -a compose_args=() metadata_path="${stack_dir}/metadata.json" env_path="$(get_stack_env_path "${stack_dir}")" generated_compose_path="$(get_stack_generated_compose_path "${stack_dir}")" generated_compose_tmp_path="${generated_compose_path}.tmp" if [ ! -f "${metadata_path}" ]; then return 1 fi if [ ! -f "${env_path}" ]; then return 1 fi env_erpnext_version="$(get_env_file_key_value "${env_path}" "ERPNEXT_VERSION" || true)" if [ -z "${env_erpnext_version}" ]; then fallback_erpnext_version="$(get_default_erpnext_version || true)" fi compose_files_lines="$(get_metadata_compose_files_lines "${metadata_path}" || true)" if [ -z "${compose_files_lines}" ]; then return 1 fi repo_root="$(get_easy_docker_repo_root)" while IFS= read -r compose_file; do if [ -z "${compose_file}" ]; then continue fi source_compose_path="${repo_root}/${compose_file}" if [ ! -f "${source_compose_path}" ]; then return 1 fi compose_args+=(-f "${source_compose_path}") done <"${generated_compose_tmp_path}"; then rm -f -- "${generated_compose_tmp_path}" >/dev/null 2>&1 || true return 1 fi elif ! docker compose --env-file "${env_path}" "${compose_args[@]}" config >"${generated_compose_tmp_path}"; then rm -f -- "${generated_compose_tmp_path}" >/dev/null 2>&1 || true return 1 fi if ! mv -- "${generated_compose_tmp_path}" "${generated_compose_path}"; then rm -f -- "${generated_compose_tmp_path}" >/dev/null 2>&1 || true return 1 fi return 0 } start_stack_with_compose_from_metadata() { local stack_dir="${1}" local metadata_path="" local env_path="" local compose_files_lines="" local compose_file="" local source_compose_path="" local env_erpnext_version="" local fallback_erpnext_version="" local configured_pull_policy="" local runtime_pull_policy="" local custom_image="" local custom_tag="" local image_ref="" local stack_topology="" local repo_root="" local -a compose_args=() # shellcheck disable=SC2034 # Read by manage flow after start_stack_with_compose_from_metadata fails. EASY_DOCKER_COMPOSE_ERROR_DETAIL="" metadata_path="${stack_dir}/metadata.json" env_path="$(get_stack_env_path "${stack_dir}")" if [ ! -f "${metadata_path}" ]; then return 31 fi if [ ! -f "${env_path}" ]; then return 32 fi stack_topology="$(get_stack_topology "${stack_dir}" || true)" if [ -z "${stack_topology}" ]; then # shellcheck disable=SC2034 # Read by manage flow after start_stack_with_compose_from_metadata returns 33. EASY_DOCKER_COMPOSE_ERROR_DETAIL="metadata.json missing topology" return 33 fi case "${stack_topology}" in "single-host") ;; *) # shellcheck disable=SC2034 # Read by manage flow after start_stack_with_compose_from_metadata returns 34. EASY_DOCKER_COMPOSE_ERROR_DETAIL="${stack_topology}" return 34 ;; esac env_erpnext_version="$(get_env_file_key_value "${env_path}" "ERPNEXT_VERSION" || true)" if [ -z "${env_erpnext_version}" ]; then fallback_erpnext_version="$(get_default_erpnext_version || true)" fi configured_pull_policy="$(get_env_file_key_value "${env_path}" "PULL_POLICY" || true)" if [ -z "${configured_pull_policy}" ]; then custom_image="$(get_env_file_key_value "${env_path}" "CUSTOM_IMAGE" || true)" custom_tag="$(get_env_file_key_value "${env_path}" "CUSTOM_TAG" || true)" if [ -n "${custom_image}" ] && [ -n "${custom_tag}" ]; then image_ref="${custom_image}:${custom_tag}" if docker image inspect "${image_ref}" >/dev/null 2>&1; then runtime_pull_policy="if_not_present" fi fi fi compose_files_lines="$(get_metadata_compose_files_lines "${metadata_path}" || true)" if [ -z "${compose_files_lines}" ]; then return 35 fi repo_root="$(get_easy_docker_repo_root)" while IFS= read -r compose_file; do if [ -z "${compose_file}" ]; then continue fi source_compose_path="${repo_root}/${compose_file}" if [ ! -f "${source_compose_path}" ]; then # shellcheck disable=SC2034 # Read by manage flow after start_stack_with_compose_from_metadata returns 36. EASY_DOCKER_COMPOSE_ERROR_DETAIL="${source_compose_path}" return 36 fi compose_args+=(-f "${source_compose_path}") done </dev/null )" compose_status=$? else running_services_lines="$( docker compose --env-file "${env_path}" "${compose_args[@]}" ps --status running --services 2>/dev/null )" compose_status=$? fi if [ "${compose_status}" -ne 0 ]; then printf -v "${result_var}" "%s" "Unknown (docker compose status failed)" return 0 fi while IFS= read -r compose_file; do if [ -n "${compose_file}" ]; then running_services_count=$((running_services_count + 1)) fi done <&1)"; then : else # shellcheck disable=SC2034 # Read by manage flow after build_stack_custom_image returns 24. EASY_DOCKER_BUILD_ERROR_DETAIL="$(printf '%s@%s :: %s' "${app_url}" "${app_branch}" "${git_error}")" return 24 fi done <