78 lines
3.4 KiB
Docker
78 lines
3.4 KiB
Docker
# Полная сборка манифестов 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"]
|