# Изменено: 2026-04-04 — добавлена IoT поддержка: COPY iot/ + сборка iot-mqtt-bridge бинаря # Multi-stage build для sless оператора. # Stage 1: сборка бинаря (golang:1.23-alpine) # Stage 2: минимальный образ (alpine:3.19, не distroless — нужен ca-certificates для S3/HTTPS) FROM golang:1.25-alpine AS builder ARG TARGETOS ARG TARGETARCH WORKDIR /workspace COPY go.mod go.mod COPY go.sum go.sum RUN go mod download # Копируем весь исходный код (включая internal/ — там основная логика) COPY main.go main.go COPY api/ api/ COPY controllers/ controllers/ COPY internal/ internal/ COPY migrations/ migrations/ # iot/ — IoT CRD types, controller, mqtt-bridge cmd. # Обязательно: main.go импортирует iot/api/v1alpha1 и iot/controllers — без этого go build упадёт. COPY iot/ iot/ RUN CGO_ENABLED=0 GOOS=${TARGETOS:-linux} GOARCH=${TARGETARCH} go build -a -o manager main.go # iot-mqtt-bridge — отдельный бинарь в том же образе. # Запускается в iot-mqtt-bridge Deployment через command: ["/iot-mqtt-bridge"]. # Один образ, два entrypoint — практично для MVP: один CI pipeline, один registry repo. RUN CGO_ENABLED=0 GOOS=${TARGETOS:-linux} GOARCH=${TARGETARCH} go build -a -o iot-mqtt-bridge ./iot/cmd/mqtt-bridge/ # iot-kafka-consumer — читает из Kafka топика iot.telemetry и пишет в IoT Postgres. # Запускается отдельным Deployment-ом через command: ["/iot-kafka-consumer"]. RUN CGO_ENABLED=0 GOOS=${TARGETOS:-linux} GOARCH=${TARGETARCH} go build -a -o iot-kafka-consumer ./iot/cmd/kafka-consumer/ FROM alpine:3.19 # ca-certificates нужны для TLS (S3 HTTPS, DockerHub) RUN apk add --no-cache ca-certificates WORKDIR / COPY --from=builder /workspace/manager . # iot-mqtt-bridge — второй бинарь, запускается отдельным Deployment-ом. COPY --from=builder /workspace/iot-mqtt-bridge . # iot-kafka-consumer — третий бинарь, Kafka→Postgres pipeline. COPY --from=builder /workspace/iot-kafka-consumer . # migrations нужны при старте — оператор читает SQL файлы для инициализации БД COPY migrations/ migrations/ # Запускаем от непривилегированного пользователя USER 65532:65532 ENTRYPOINT ["/manager"]