#!/bin/sh # Собирает .so, нужные NIF/priv из release (ldd), для runtime-слоя. # Исключает musl/libc — их даёт базовый alpine-образ. # Usage: collect-runtime-libs.sh set -eu RELEASE="${1:?release_dir}" OUT="${2:?output_root}" mkdir -p "${OUT}" is_base_lib() { case "$1" in /lib/ld-musl-*|*/ld-musl-*|*/libc.musl-*) return 0 ;; esac return 1 } copy_lib() { lib="$1" [ -e "${lib}" ] || return 0 is_base_lib "${lib}" && return 0 dest="${OUT}${lib}" mkdir -p "$(dirname "${dest}")" if [ -L "${lib}" ]; then cp -a "${lib}" "${dest}" else cp -L "${lib}" "${dest}" 2>/dev/null || cp "${lib}" "${dest}" fi } # shellcheck disable=SC2044 for so in $(find "${RELEASE}" -name '*.so' 2>/dev/null); do ldd "${so}" 2>/dev/null | while read -r line; do case "${line}" in *'=>'*) lib=$(echo "${line}" | awk '{print $3}') [ -n "${lib}" ] && copy_lib "${lib}" ;; /lib/*|/usr/lib/*) lib=$(echo "${line}" | awk '{print $1}') copy_lib "${lib}" ;; esac done done echo "collect-runtime-libs: $(find "${OUT}" -name '*.so*' 2>/dev/null | wc -l) files under ${OUT}"