# ╔═════════════════════════════════════════════════════╗ # ║ SETUP ║ # ╚═════════════════════════════════════════════════════╝ # GLOBAL ARG APP_UID=1000 \ APP_GID=1000 \ BUILD_SRC=https://github.com/netbirdio/netbird.git \ BUILD_ROOT="/go/netbird/management /go/netbird/relay /go/netbird/signal" \ GO_VERSION=1.24 # :: FOREIGN IMAGES FROM 11notes/nginx:stable AS distroless-nginx FROM 11notes/distroless:curl AS distroless-curl FROM 11notes/util AS util # ╔═════════════════════════════════════════════════════╗ # ║ BUILD ║ # ╚═════════════════════════════════════════════════════╝ # :: netbird FROM 11notes/go:${GO_VERSION} AS build ARG APP_VERSION \ BUILD_SRC \ BUILD_ROOT RUN set -ex; \ git clone ${BUILD_SRC} -b v${APP_VERSION}; \ sed -i 's/"development"/"v'${APP_VERSION}'"/' /go/netbird/version/version.go; RUN set -ex; \ for BUILD in ${BUILD_ROOT}; do \ cd ${BUILD}; \ BUILD_BIN="${BUILD}/$(echo ${BUILD} | awk -F '/' '{print $4}')"; \ go mod tidy; \ eleven go build ${BUILD_BIN} main.go; \ eleven distroless ${BUILD_BIN}; \ done; \ mv /distroless/usr/local/bin/management /distroless/usr/local/bin/netbird; # :: management FROM 11notes/go:${GO_VERSION} AS management COPY ./build/go/management /go/management ENV CGO_ENABLED=0 ARG BUILD_BIN=/go/management/management RUN set -ex; \ cd /go/management; \ eleven go build ${BUILD_BIN} main.go; \ eleven distroless ${BUILD_BIN}; # :: dashboard FROM 11notes/go:${GO_VERSION} AS dashboard COPY ./build/go/dashboard /go/dashboard ENV CGO_ENABLED=0 ARG BUILD_BIN=/go/dashboard/dashboard RUN set -ex; \ apk --update --no-cache add \ nodejs \ npm; RUN set -ex; \ cd /go/dashboard; \ eleven go build ${BUILD_BIN} main.go; \ eleven distroless ${BUILD_BIN}; RUN set -ex; \ git clone https://github.com/netbirdio/dashboard /dashboard; RUN set -ex; \ cd /dashboard; \ npm i --save; \ echo '{}' > .local-config.json; \ npm run build; \ mkdir -p /distroless/nginx/var; \ cp -R ./out/* /distroless/nginx/var; # :: file system FROM alpine AS file-system COPY --from=util / / ARG APP_ROOT USER root RUN set -ex; \ eleven mkdir /distroless${APP_ROOT}/{etc,var}; \ mkdir -p /distroless/var/lib; \ ln -sf ${APP_ROOT}/var /distroless/var/lib/netbird; # ╔═════════════════════════════════════════════════════╗ # ║ IMAGE ║ # ╚═════════════════════════════════════════════════════╝ # :: HEADER FROM scratch # :: default arguments ARG TARGETPLATFORM \ TARGETOS \ TARGETARCH \ TARGETVARIANT \ APP_IMAGE \ APP_NAME \ APP_VERSION \ APP_ROOT \ APP_UID \ APP_GID \ APP_NO_CACHE # :: default environment ENV APP_IMAGE=${APP_IMAGE} \ APP_NAME=${APP_NAME} \ APP_VERSION=${APP_VERSION} \ APP_ROOT=${APP_ROOT} # :: multi-stage COPY --from=build /distroless/ / COPY --from=dashboard --chown=${APP_UID}:${APP_GID} /distroless/ / COPY --from=management --chown=${APP_UID}:${APP_GID} /distroless/ / COPY --from=distroless-nginx --chown=${APP_UID}:${APP_GID} / / COPY --from=file-system --chown=${APP_UID}:${APP_GID} /distroless/ / COPY --from=distroless-curl /usr/local/bin /usr/local/bin COPY --chown=${APP_UID}:${APP_GID} ./rootfs/ / # :: PERSISTENT DATA VOLUME ["${APP_ROOT}/etc", "${APP_ROOT}/var"] # :: EXECUTE USER ${APP_UID}:${APP_GID}