-
Notifications
You must be signed in to change notification settings - Fork 1.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
make Docker build smarter, add Dockerfile.debian #6344
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -7,3 +7,4 @@ | |
build | ||
tests/testdata | ||
cmd/prometheus | ||
vendor |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,102 @@ | ||
# syntax = docker/dockerfile:1.2 | ||
FROM docker.io/library/golang:1.19-bullseye AS builder | ||
|
||
RUN apt update | ||
RUN apt install -y build-essential git bash ca-certificates libstdc++6 | ||
|
||
WORKDIR /app | ||
ADD go.mod go.mod | ||
ADD go.sum go.sum | ||
|
||
RUN go mod download | ||
ADD . . | ||
|
||
RUN --mount=type=cache,target=/root/.cache \ | ||
--mount=type=cache,target=/tmp/go-build \ | ||
--mount=type=cache,target=/go/pkg/mod \ | ||
make all | ||
|
||
|
||
FROM docker.io/library/golang:1.19-alpine3.16 AS tools-builder | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. are you sure an alpine here? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. i think it would be best for tools to be build with same lib as where supposedly the db is created. used the golang alpine so that i could easily use go mod vendor |
||
|
||
RUN apk --no-cache add build-base linux-headers git bash ca-certificates libstdc++ | ||
WORKDIR /app | ||
|
||
ADD Makefile Makefile | ||
ADD tools.go tools.go | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think this line is useless, because tools.go used to ensure binary dep is stored in go.mod There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. since i'm not copying the rest of the files, 'go mod vendor' will run 'go mod tidy' first, which cause those deps to be removed, unless tools.go file is there, so it only worked for me when i copied the file. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Don't see reason to call "go mod tidy" in docker. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 'go mod vendor' which is used by the db-tools build process calls 'tidy'. not sure if there's a way to call vendor without tidy There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. got it |
||
ADD go.mod go.mod | ||
ADD go.sum go.sum | ||
|
||
RUN mkdir -p /app/build/bin | ||
|
||
RUN make db-tools | ||
|
||
FROM docker.io/library/debian:bullseye | ||
|
||
# install required runtime libs, along with some helpers for debugging | ||
RUN apt update | ||
RUN apt install -y ca-certificates libstdc++6 tzdata | ||
RUN apt install -y curl jq dnsutils | ||
|
||
# Setup user and group | ||
# | ||
# from the perspective of the container, uid=1000, gid=1000 is a sensible choice | ||
# (mimicking Ubuntu Server), but if caller creates a .env (example in repo root), | ||
# these defaults will get overridden when make calls docker-compose | ||
ARG UID=1000 | ||
RUN adduser --uid $UID erigon | ||
USER erigon | ||
RUN mkdir -p ~/.local/share/erigon | ||
|
||
# copy compiled artifacts from builder | ||
## first do the mdbx ones - since these wont change as often | ||
COPY --from=tools-builder /app/build/bin/mdbx_chk /usr/local/bin/mdbx_chk | ||
COPY --from=tools-builder /app/build/bin/mdbx_copy /usr/local/bin/mdbx_copy | ||
COPY --from=tools-builder /app/build/bin/mdbx_drop /usr/local/bin/mdbx_drop | ||
COPY --from=tools-builder /app/build/bin/mdbx_dump /usr/local/bin/mdbx_dump | ||
COPY --from=tools-builder /app/build/bin/mdbx_load /usr/local/bin/mdbx_load | ||
COPY --from=tools-builder /app/build/bin/mdbx_stat /usr/local/bin/mdbx_stat | ||
|
||
## then give each binary its own layer | ||
COPY --from=builder /app/build/bin/devnet /usr/local/bin/devnet | ||
COPY --from=builder /app/build/bin/downloader /usr/local/bin/downloader | ||
COPY --from=builder /app/build/bin/erigon /usr/local/bin/erigon | ||
COPY --from=builder /app/build/bin/erigon-cl /usr/local/bin/erigon-cl | ||
COPY --from=builder /app/build/bin/evm /usr/local/bin/evm | ||
COPY --from=builder /app/build/bin/hack /usr/local/bin/hack | ||
COPY --from=builder /app/build/bin/integration /usr/local/bin/integration | ||
COPY --from=builder /app/build/bin/lightclient /usr/local/bin/lightclient | ||
COPY --from=builder /app/build/bin/observer /usr/local/bin/observer | ||
COPY --from=builder /app/build/bin/pics /usr/local/bin/pics | ||
COPY --from=builder /app/build/bin/rpcdaemon /usr/local/bin/rpcdaemon | ||
COPY --from=builder /app/build/bin/rpctest /usr/local/bin/rpctest | ||
COPY --from=builder /app/build/bin/sentinel /usr/local/bin/sentinel | ||
COPY --from=builder /app/build/bin/sentry /usr/local/bin/sentry | ||
COPY --from=builder /app/build/bin/state /usr/local/bin/state | ||
COPY --from=builder /app/build/bin/txpool /usr/local/bin/txpool | ||
COPY --from=builder /app/build/bin/verkle /usr/local/bin/verkle | ||
|
||
EXPOSE 8545 \ | ||
8551 \ | ||
8546 \ | ||
30303 \ | ||
30303/udp \ | ||
42069 \ | ||
42069/udp \ | ||
8080 \ | ||
9090 \ | ||
6060 | ||
|
||
# https://github.com/opencontainers/image-spec/blob/main/annotations.md | ||
ARG BUILD_DATE | ||
ARG VCS_REF | ||
ARG VERSION | ||
LABEL org.label-schema.build-date=$BUILD_DATE \ | ||
org.label-schema.description="Erigon Ethereum Client" \ | ||
org.label-schema.name="Erigon" \ | ||
org.label-schema.schema-version="1.0" \ | ||
org.label-schema.url="https://torquem.ch" \ | ||
org.label-schema.vcs-ref=$VCS_REF \ | ||
org.label-schema.vcs-url="https://github.com/ledgerwatch/erigon.git" \ | ||
org.label-schema.vendor="Torquem" \ | ||
org.label-schema.version=$VERSION |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Are you sure libstdc++6 is needed and why 6
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
i copied the deps from alpine - the matching dependency in terms of most compatibililty for libstdc++ is libstdc++6 (glibc6). Not 100% if it is needed for runtime, i assumed it was there in the alpine one for a reason though.
the other option in debian is libstdc++5 (glibc3.3)