diff --git a/.github/workflows/docker-publish.yaml b/.github/workflows/docker-publish.yaml index 3a69ab789..b7827bfbb 100644 --- a/.github/workflows/docker-publish.yaml +++ b/.github/workflows/docker-publish.yaml @@ -47,12 +47,12 @@ jobs: username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - # Build And Push Image - - name: Build Docker image - run: docker compose -f docker-compose-internal.yaml build - - name: Push Docker image + # Build And Push Images + - name: Build Docker images + run: docker buildx bake + - name: Push Docker images if: github.ref == 'refs/heads/master' - run: docker compose -f docker-compose-internal.yaml push + run: docker buildx bake --push - name: Send GitHub Action trigger data to Slack workflow if: ${{ failure() }} diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..011cf459b --- /dev/null +++ b/Dockerfile @@ -0,0 +1,109 @@ +# syntax=docker/dockerfile:1 + +# Declare build arguments +# TODO: this is only used for node image right now, should we also use it for nodeplugin? +ARG SEMVER="" +ARG GITCOMMIT="" +ARG GITDATE="" + +FROM golang:1.21.1-alpine3.18 AS base-builder +RUN apk add --no-cache make musl-dev linux-headers gcc git jq bash + +# Common build stage +FROM base-builder AS common-builder +WORKDIR /app +COPY go.mod go.sum ./ +COPY disperser /app/disperser +COPY common /app/common +COPY core /app/core +COPY api /app/api +COPY contracts /app/contracts +COPY indexer /app/indexer +COPY encoding /app/encoding + +# Churner build stage +FROM common-builder AS churner-builder +COPY operators ./operators +WORKDIR /app/operators +RUN --mount=type=cache,target=/go/pkg/mod \ + --mount=type=cache,target=/root/.cache/go-build \ + go build -o ./bin/churner ./churner/cmd + +# Encoder build stage +FROM common-builder AS encoder-builder +WORKDIR /app/disperser +RUN --mount=type=cache,target=/go/pkg/mod \ + --mount=type=cache,target=/root/.cache/go-build \ + go build -o ./bin/encoder ./cmd/encoder + +# API Server build stage +FROM common-builder AS apiserver-builder +WORKDIR /app/disperser +RUN --mount=type=cache,target=/go/pkg/mod \ + --mount=type=cache,target=/root/.cache/go-build \ + go build -o ./bin/apiserver ./cmd/apiserver + +# Batcher build stage +FROM common-builder AS batcher-builder +WORKDIR /app/disperser +RUN --mount=type=cache,target=/go/pkg/mod \ + --mount=type=cache,target=/root/.cache/go-build \ + go build -o ./bin/batcher ./cmd/batcher + +# Retriever build stage +FROM common-builder AS retriever-builder +COPY retriever /app/retriever +COPY node /app/node +COPY operators/churner /app/operators/churner +WORKDIR /app/retriever +RUN --mount=type=cache,target=/go/pkg/mod \ + --mount=type=cache,target=/root/.cache/go-build \ + go build -o ./bin/retriever ./cmd + +# Node build stage +FROM common-builder AS node-builder +COPY node /app/node +COPY operators/churner /app/operators/churner +WORKDIR /app/node +RUN --mount=type=cache,target=/go/pkg/mod \ + --mount=type=cache,target=/root/.cache/go-build \ + go build -ldflags="-X 'github.com/Layr-Labs/eigenda/node.SemVer=${SEMVER}' -X 'github.com/Layr-Labs/eigenda/node.GitCommit=${GITCOMMIT}' -X 'github.com/Layr-Labs/eigenda/node.GitDate=${GITDATE}'" -o ./bin/node ./cmd + +# Nodeplugin build stage +FROM common-builder AS node-plugin-builder +COPY ./node /app/node +COPY operators/churner /app/operators/churner +WORKDIR /app/node +RUN --mount=type=cache,target=/go/pkg/mod \ + --mount=type=cache,target=/root/.cache/go-build \ + go build -o ./bin/nodeplugin ./plugin/cmd + + +# Final stages for each component +FROM alpine:3.18 AS churner +COPY --from=churner-builder /app/operators/bin/churner /usr/local/bin +ENTRYPOINT ["churner"] + +FROM alpine:3.18 AS encoder +COPY --from=encoder-builder /app/disperser/bin/encoder /usr/local/bin +ENTRYPOINT ["encoder"] + +FROM alpine:3.18 AS apiserver +COPY --from=apiserver-builder /app/disperser/bin/apiserver /usr/local/bin +ENTRYPOINT ["apiserver"] + +FROM alpine:3.18 AS batcher +COPY --from=batcher-builder /app/disperser/bin/batcher /usr/local/bin +ENTRYPOINT ["batcher"] + +FROM alpine:3.18 AS retriever +COPY --from=retriever-builder /app/retriever/bin/retriever /usr/local/bin +ENTRYPOINT ["retriever"] + +FROM alpine:3.18 AS node +COPY --from=node-builder /app/node/bin/node /usr/local/bin +ENTRYPOINT ["node"] + +FROM alpine:3.18 AS nodeplugin +COPY --from=node-plugin-builder /app/node/bin/nodeplugin /usr/local/bin +ENTRYPOINT ["nodeplugin"] \ No newline at end of file diff --git a/Makefile b/Makefile index acd3b2d3a..267c23c0e 100644 --- a/Makefile +++ b/Makefile @@ -94,7 +94,8 @@ integration-tests-dataapi: go test -v ./disperser/dataapi docker-release-build: - RELEASE_TAG=${SEMVER} docker compose -f docker-compose-release.yaml build --build-arg SEMVER=${SEMVER} --build-arg GITCOMMIT=${GITCOMMIT} --build-arg GITDATE=${GITDATE} ${PUSH_FLAG} + BUILD_TAG=${SEMVER} SEMVER=${SEMVER} GITCOMMIT=${GITCOMMIT} GITDATE=${GITDATE} \ + docker buildx bake node-group-release ${PUSH_FLAG} semver: echo "${SEMVER}" diff --git a/disperser/cmd/apiserver/Dockerfile b/disperser/cmd/apiserver/Dockerfile deleted file mode 100644 index 75b5c6a83..000000000 --- a/disperser/cmd/apiserver/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -FROM golang:1.21.1-alpine3.18 as builder - -RUN apk add --no-cache make musl-dev linux-headers gcc git jq bash - -# build dispersal api server with local monorepo go modules -COPY ./disperser /app/disperser -COPY common /app/common -COPY contracts /app/contracts -COPY core /app/core -COPY api /app/api -COPY indexer /app/indexer -COPY encoding /app/encoding -COPY go.mod /app -COPY go.sum /app - -WORKDIR /app/disperser - -RUN --mount=type=cache,target=/go/pkg/mod \ - --mount=type=cache,target=/root/.cache/go-build \ - go build -o ./bin/server ./cmd/apiserver - -FROM alpine:3.18 - -COPY --from=builder /app/disperser/bin/server /usr/local/bin - -ENTRYPOINT ["server"] \ No newline at end of file diff --git a/disperser/cmd/batcher/Dockerfile b/disperser/cmd/batcher/Dockerfile deleted file mode 100644 index 125413b73..000000000 --- a/disperser/cmd/batcher/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -FROM golang:1.21.1-alpine3.18 as builder - -RUN apk add --no-cache make musl-dev linux-headers gcc git jq bash - -# build batcher with local monorepo go modules -COPY ./disperser /app/disperser -COPY common /app/common -COPY core /app/core -COPY api /app/api -COPY contracts /app/contracts -COPY indexer /app/indexer -COPY encoding /app/encoding -COPY go.mod /app -COPY go.sum /app - -WORKDIR /app/disperser - -RUN --mount=type=cache,target=/go/pkg/mod \ - --mount=type=cache,target=/root/.cache/go-build \ - go build -o ./bin/server ./cmd/batcher - -FROM alpine:3.18 - -COPY --from=builder /app/disperser/bin/server /usr/local/bin - -ENTRYPOINT ["server"] diff --git a/disperser/cmd/dataapi/Dockerfile b/disperser/cmd/dataapi/Dockerfile deleted file mode 100644 index b04fa5000..000000000 --- a/disperser/cmd/dataapi/Dockerfile +++ /dev/null @@ -1,27 +0,0 @@ -FROM golang:1.21.1-alpine3.18 as builder - -RUN apk add --no-cache make musl-dev linux-headers gcc git jq bash - -# build data api server with local monorepo go modules -COPY ./disperser /app/disperser -COPY operators/ejector /app/operators/ejector -COPY common /app/common -COPY contracts /app/contracts -COPY core /app/core -COPY api /app/api -COPY indexer /app/indexer -COPY encoding /app/encoding -COPY go.mod /app -COPY go.sum /app - -WORKDIR /app/disperser - -RUN --mount=type=cache,target=/go/pkg/mod \ - --mount=type=cache,target=/root/.cache/go-build \ - go build -o ./bin/server ./cmd/dataapi - -FROM alpine:3.18 - -COPY --from=builder /app/disperser/bin/server /usr/local/bin - -ENTRYPOINT ["server"] diff --git a/disperser/cmd/encoder/Dockerfile b/disperser/cmd/encoder/Dockerfile deleted file mode 100644 index 4fa036917..000000000 --- a/disperser/cmd/encoder/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -FROM golang:1.21.1-alpine3.18 as builder - -RUN apk add --no-cache make musl-dev linux-headers gcc git jq bash - -# build encoder with local monorepo go modules -COPY ./disperser /app/disperser -COPY common /app/common -COPY contracts /app/contracts -COPY core /app/core -COPY api /app/api -COPY indexer /app/indexer -COPY encoding /app/encoding -COPY go.mod /app -COPY go.sum /app - -WORKDIR /app/disperser - -RUN --mount=type=cache,target=/go/pkg/mod \ - --mount=type=cache,target=/root/.cache/go-build \ - go build -o ./bin/server ./cmd/encoder - -FROM alpine:3.18 - -COPY --from=builder /app/disperser/bin/server /usr/local/bin - -ENTRYPOINT ["server"] diff --git a/docker-bake.hcl b/docker-bake.hcl new file mode 100644 index 000000000..0144d0f5f --- /dev/null +++ b/docker-bake.hcl @@ -0,0 +1,113 @@ +# VARIABLES + +variable "BUILD_TAG" { + default = "latest" +} + +variable "SEMVER" { + default = "v0.0.0" +} + +variable "GITCOMMIT" { + default = "dev" +} + +variable "GITDATE" { + default = "0" +} + +# GROUPS + +group "default" { + targets = ["all"] +} + +group "all" { + targets = ["node-group", "disperser-group", "retriever", "churner"] +} + +group "node-group" { + targets = ["node", "nodeplugin"] +} + +group "disperser-group" { + targets = ["batcher", "disperser", "encoder"] +} + +group "node-group-release" { + targets = ["node-release", "nodeplugin-release"] +} + +# DISPERSER TARGETS + +target "batcher" { + context = "." + dockerfile = "./Dockerfile" + target = "batcher" + tags = ["ghcr.io/layr-labs/eigenda/batcher:${BUILD_TAG}"] +} + +target "disperser" { + context = "." + dockerfile = "./Dockerfile" + target = "apiserver" + tags = ["ghcr.io/layr-labs/eigenda/disperser:${BUILD_TAG}"] +} + +target "encoder" { + context = "." + dockerfile = "./Dockerfile" + target = "encoder" + tags = ["ghcr.io/layr-labs/eigenda/encoder:${BUILD_TAG}"] +} + +target "retriever" { + context = "." + dockerfile = "./Dockerfile" + target = "retriever" + tags = ["ghcr.io/layr-labs/eigenda/retriever:${BUILD_TAG}"] +} + +target "churner" { + context = "." + dockerfile = "./Dockerfile" + target = "churner" + tags = ["ghcr.io/layr-labs/eigenda/churner:${BUILD_TAG}"] +} + +# NODE TARGETS + +target "node" { + context = "." + dockerfile = "./Dockerfile" + target = "node" + tags = ["ghcr.io/layr-labs/eigenda/node:${BUILD_TAG}"] + args = { + SEMVER = "${SEMVER}" + GITCOMMIT = "${GITCOMMIT}" + GITDATE = "${GITDATE}" + } +} + +target "nodeplugin" { + context = "." + dockerfile = "./Dockerfile" + target = "nodeplugin" + tags = ["ghcr.io/layr-labs/eigenda/nodeplugin:${BUILD_TAG}"] +} + +# RELEASE TARGETS + +target "_release" { + platforms = ["linux/amd64", "linux/arm64"] +} + +target "node-release" { + inherits = ["node", "_release"] + tags = ["ghcr.io/layr-labs/eigenda/opr-node:${BUILD_TAG}"] +} + +target "nodeplugin-release" { + inherits = ["nodeplugin", "_release"] + tags = ["ghcr.io/layr-labs/eigenda/opr-nodeplugin:${BUILD_TAG}"] +} \ No newline at end of file diff --git a/docker-compose-internal.yaml b/docker-compose-internal.yaml deleted file mode 100644 index 473aeec17..000000000 --- a/docker-compose-internal.yaml +++ /dev/null @@ -1,37 +0,0 @@ -# This file is used for building and pushing images -services: - batcher: - build: - context: . - dockerfile: disperser/cmd/batcher/Dockerfile - image: ghcr.io/layr-labs/eigenda/batcher:${BUILD_TAG:-latest} - disperser: - build: - context: . - dockerfile: disperser/cmd/apiserver/Dockerfile - image: ghcr.io/layr-labs/eigenda/disperser:${BUILD_TAG:-latest} - encoder: - build: - context: . - dockerfile: disperser/cmd/encoder/Dockerfile - image: ghcr.io/layr-labs/eigenda/encoder:${BUILD_TAG:-latest} - retriever: - build: - context: . - dockerfile: retriever/cmd/Dockerfile - image: ghcr.io/layr-labs/eigenda/retriever:${BUILD_TAG:-latest} - node: - build: - context: . - dockerfile: node/cmd/Dockerfile - image: ghcr.io/layr-labs/eigenda/node:${BUILD_TAG:-latest} - churner: - build: - context: . - dockerfile: operators/churner/cmd/Dockerfile - image: ghcr.io/layr-labs/eigenda/churner:${BUILD_TAG:-latest} - nodeplugin: - build: - context: . - dockerfile: node/plugin/cmd/Dockerfile - image: ghcr.io/layr-labs/eigenda/nodeplugin:${BUILD_TAG:-latest} diff --git a/docker-compose-release.yaml b/docker-compose-release.yaml deleted file mode 100644 index 2cd3ccfc3..000000000 --- a/docker-compose-release.yaml +++ /dev/null @@ -1,18 +0,0 @@ -# This file is used for building and pushing images -services: - node: - build: - context: . - dockerfile: node/cmd/Dockerfile - platforms: - - "linux/amd64" - - "linux/arm64" - image: ghcr.io/layr-labs/eigenda/opr-node:${RELEASE_TAG} - nodeplugin: - build: - context: . - dockerfile: node/plugin/cmd/Dockerfile - platforms: - - "linux/amd64" - - "linux/arm64" - image: ghcr.io/layr-labs/eigenda/opr-nodeplugin:${RELEASE_TAG} diff --git a/node/cmd/Dockerfile b/node/cmd/Dockerfile deleted file mode 100644 index 60777cb9a..000000000 --- a/node/cmd/Dockerfile +++ /dev/null @@ -1,29 +0,0 @@ -FROM golang:1.21.1-alpine3.18 as builder - -ARG SEMVER="" -ARG GITCOMMIT="" -ARG GITDATE="" - -RUN apk add --no-cache make musl-dev linux-headers gcc git jq bash - -# build node with local monorepo go modules -COPY ./node /app/node -COPY operators/churner /app/operators/churner -COPY indexer /app/indexer -COPY common /app/common -COPY core /app/core -COPY api /app/api -COPY contracts /app/contracts -COPY encoding /app/encoding -COPY go.mod /app -COPY go.sum /app - -WORKDIR /app/node - -RUN go build -ldflags="-X 'github.com/Layr-Labs/eigenda/node.SemVer=${SEMVER}' -X 'github.com/Layr-Labs/eigenda/node.GitCommit=${GITCOMMIT}' -X 'github.com/Layr-Labs/eigenda/node.GitDate=${GITDATE}'" -o ./bin/node ./cmd - -FROM alpine:3.18 - -COPY --from=builder /app/node/bin/node /usr/local/bin - -ENTRYPOINT ["node"] diff --git a/node/plugin/cmd/Dockerfile b/node/plugin/cmd/Dockerfile deleted file mode 100644 index 2b02f319e..000000000 --- a/node/plugin/cmd/Dockerfile +++ /dev/null @@ -1,25 +0,0 @@ -FROM golang:1.21.1-alpine3.18 as builder - -RUN apk add --no-cache make musl-dev linux-headers gcc git jq bash - -# build node with local monorepo go modules -COPY ./node /app/node -COPY operators/churner /app/operators/churner -COPY indexer /app/indexer -COPY common /app/common -COPY core /app/core -COPY api /app/api -COPY contracts /app/contracts -COPY encoding /app/encoding -COPY go.mod /app -COPY go.sum /app - -WORKDIR /app/node - -RUN go build -o ./bin/nodeplugin ./plugin/cmd - -FROM alpine:3.18 - -COPY --from=builder /app/node/bin/nodeplugin /usr/local/bin - -ENTRYPOINT ["nodeplugin"] diff --git a/operators/churner/cmd/Dockerfile b/operators/churner/cmd/Dockerfile deleted file mode 100644 index 7386d225f..000000000 --- a/operators/churner/cmd/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -FROM golang:1.21.1-alpine3.18 as builder - -RUN apk add --no-cache make musl-dev linux-headers gcc git jq bash - -# build node with local monorepo go modules -COPY ./operators /app/operators -COPY common /app/common -COPY core /app/core -COPY api /app/api -COPY indexer /app/indexer -COPY contracts /app/contracts -COPY encoding /app/encoding -COPY go.mod /app -COPY go.sum /app - -WORKDIR /app/operators - -RUN --mount=type=cache,target=/go/pkg/mod \ - --mount=type=cache,target=/root/.cache/go-build \ - go build -o ./bin/churner ./churner/cmd - -FROM alpine:3.18 - -COPY --from=builder /app/operators/bin/churner /usr/local/bin - -ENTRYPOINT ["churner"] diff --git a/retriever/cmd/Dockerfile b/retriever/cmd/Dockerfile deleted file mode 100644 index 425b13df4..000000000 --- a/retriever/cmd/Dockerfile +++ /dev/null @@ -1,29 +0,0 @@ -FROM golang:1.21.1-alpine3.18 as builder - -RUN apk add --no-cache make musl-dev linux-headers gcc git jq bash - -# build node with local monorepo go modules -COPY ./retriever /app/retriever -COPY common /app/common -COPY core /app/core -COPY api /app/api -COPY contracts /app/contracts -COPY disperser /app/disperser -COPY node /app/node -COPY operators/churner /app/operators/churner -COPY indexer /app/indexer -COPY encoding /app/encoding -COPY go.mod /app -COPY go.sum /app - -WORKDIR /app/retriever - -RUN --mount=type=cache,target=/go/pkg/mod \ - --mount=type=cache,target=/root/.cache/go-build \ - go build -o ./bin/retriever ./cmd - -FROM alpine:3.18 - -COPY --from=builder /app/retriever/bin/retriever /usr/local/bin - -ENTRYPOINT ["retriever"]