# Полная сборка манифестов IaC-репозитория для одного контура. # # docker build --build-arg CONTOUR=aero -t iac:aero . # docker run --rm iac:aero list # что собралось # docker run --rm iac:aero cat clusters # слои Flux одним потоком # docker run --rm -v "$PWD/out:/export" iac:aero export # # Контур — имя каталога в clusters/ (aero, brusnika-prod, dsinv, wb, ...). # Тот же идентификатор служит именем overlay внутри apps/* и infrastructure/*, # поэтому одного аргумента хватает на весь рендер. # # Сборка офлайновая: kustomize build разворачивает оверлеи и патчи, а # HelmRelease остаётся Custom Resource'ом — чарты тянет Flux уже в кластере. # Ни helm, ни доступ к OCI-реестру здесь не нужны. Исключение — валидация: # схемы CRD kubeconform берёт из сети (отключается VALIDATE=0). ARG KUSTOMIZE_VERSION=v5.4.3 ARG KUBECONFORM_VERSION=v0.6.7 FROM registry.k8s.io/kustomize/kustomize:${KUSTOMIZE_VERSION} AS kustomize FROM ghcr.io/yannh/kubeconform:${KUBECONFORM_VERSION} AS kubeconform FROM alpine:3.20 AS builder # Контур обязателен по смыслу, но значение по умолчанию оставлено: сборка без # --build-arg собирает aero, а не падает на пустой переменной. ARG CONTOUR=aero ARG VALIDATE=1 ARG KUBERNETES_VERSION=1.30.0 COPY --from=kustomize /app/kustomize /usr/local/bin/kustomize COPY --from=kubeconform /kubeconform /usr/local/bin/kubeconform WORKDIR /src # Скрипт копируется отдельным слоем: правка манифестов не инвалидирует его, # а правка скрипта не тянет за собой пересборку базовых слоёв. COPY hack/render-contour.sh /usr/local/bin/render-contour RUN chmod +x /usr/local/bin/render-contour COPY . . RUN render-contour "${CONTOUR}" /out # Валидация отдельным слоем: смена версии Kubernetes не пересобирает рендер. # --ignore-missing-schemas пропускает ресурсы, чьих схем нет в каталоге # (часть CRD), но не заглушает ошибки в тех, что нашлись. RUN if [ "${VALIDATE}" = "1" ]; then \ kubeconform \ -kubernetes-version "${KUBERNETES_VERSION}" \ -strict \ -ignore-missing-schemas \ -schema-location default \ -schema-location 'https://raw.githubusercontent.com/datreeio/CRDs-catalog/main/{{.Group}}/{{.ResourceKind}}_{{.ResourceAPIVersion}}.json' \ -summary \ /out/*.yaml ; \ else \ echo "VALIDATE=0 — проверка схемами пропущена" ; \ fi FROM alpine:3.20 ARG CONTOUR=aero ENV CONTOUR=${CONTOUR} LABEL org.opencontainers.image.title="iac-manifests" \ org.opencontainers.image.description="Собранные манифесты контура ${CONTOUR}" \ ru.iac.contour="${CONTOUR}" COPY --from=builder /out /manifests COPY hack/entrypoint.sh /usr/local/bin/entrypoint RUN chmod +x /usr/local/bin/entrypoint ENTRYPOINT ["/usr/local/bin/entrypoint"] CMD ["list"]