# syntax=docker/dockerfile:1.27@sha256:bde3983e9c939224420ddaf6b784cc30e09b035a4dea01f581230c50809f372e FROM --platform=$BUILDPLATFORM golang:1.27@sha256:3680233e3204827fbdc66088528ae6d4b3d034f51d03a99d454f6de034888244 AS backend-builder-base ARG TARGETOS ARG TARGETARCH ARG TARGETVARIANT WORKDIR /src COPY go.mod go.sum ./ RUN --mount=type=cache,target=/go/pkg/mod \ go mod download COPY gen ./gen COPY internal ./internal COPY cmd ./cmd FROM backend-builder-base AS cli-builder ARG TARGETOS ARG TARGETARCH ARG TARGETVARIANT RUN --mount=type=cache,target=/go/pkg/mod \ --mount=type=cache,target=/root/.cache/go-build \ CGO_ENABLED=0 GOOS=${TARGETOS} GOARCH=${TARGETARCH} GOARM=${TARGETVARIANT#v} \ go build -trimpath -ldflags="-s -w" -o /out/composia ./cmd/composia FROM backend-builder-base AS controller-builder ARG TARGETOS ARG TARGETARCH ARG TARGETVARIANT RUN --mount=type=cache,target=/go/pkg/mod \ --mount=type=cache,target=/root/.cache/go-build \ CGO_ENABLED=0 GOOS=${TARGETOS} GOARCH=${TARGETARCH} GOARM=${TARGETVARIANT#v} \ go build -trimpath -ldflags="-s -w" -o /out/composia-controller ./cmd/composia-controller FROM backend-builder-base AS agent-builder ARG TARGETOS ARG TARGETARCH ARG TARGETVARIANT RUN --mount=type=cache,target=/go/pkg/mod \ --mount=type=cache,target=/root/.cache/go-build \ CGO_ENABLED=0 GOOS=${TARGETOS} GOARCH=${TARGETARCH} GOARM=${TARGETVARIANT#v} \ go build -trimpath -ldflags="-s -w" -o /out/composia-agent ./cmd/composia-agent FROM golang:1.27-alpine@sha256:cf6fca6641884b8433441b2b0652976f975e1d0fdd26d177eaaf8596087f3125 AS dev WORKDIR /workspace ENV PATH="/go/bin:${PATH}" RUN printf '%s\n' '@compose-edge https://dl-cdn.alpinelinux.org/alpine/edge/community' >> /etc/apk/repositories && \ apk add --no-cache ca-certificates docker-cli docker-cli-buildx 'docker-cli-compose@compose-edge>=5.5.1' git && \ go install github.com/air-verse/air@v1.67.4 CMD ["air", "-v"] FROM alpine:3.24@sha256:28bd5fe8b56d1bd048e5babf5b10710ebe0bae67db86916198a6eec434943f8b AS cli WORKDIR /app RUN apk add --no-cache ca-certificates COPY --from=cli-builder /out/composia /usr/local/bin/composia USER 65532:65532 ENTRYPOINT ["/usr/local/bin/composia"] CMD ["--help"] FROM alpine:3.24@sha256:28bd5fe8b56d1bd048e5babf5b10710ebe0bae67db86916198a6eec434943f8b AS controller WORKDIR /app RUN apk add --no-cache ca-certificates git tini COPY --from=controller-builder /out/composia-controller /usr/local/bin/composia-controller USER 65532:65532 ENTRYPOINT ["/sbin/tini", "--", "/usr/local/bin/composia-controller"] CMD ["-config", "/app/config.yaml"] FROM alpine:3.24@sha256:28bd5fe8b56d1bd048e5babf5b10710ebe0bae67db86916198a6eec434943f8b AS agent WORKDIR /app ENV HOME=/tmp \ DOCKER_CONFIG=/tmp/.docker RUN printf '%s\n' '@compose-edge https://dl-cdn.alpinelinux.org/alpine/edge/community' >> /etc/apk/repositories && \ apk add --no-cache ca-certificates docker-cli docker-cli-buildx 'docker-cli-compose@compose-edge>=5.5.1' git tini COPY --from=agent-builder /out/composia-agent /usr/local/bin/composia-agent USER 65532:65532 ENTRYPOINT ["/sbin/tini", "--", "/usr/local/bin/composia-agent"] CMD ["-config", "/app/config.yaml"]