feat: add Dockerfile.dev (#7496)

We have shifted our local testing from running Lodestar binary to using
Kurtosis which requires locally built docker image.

The current Dockerfile is optimized for production release and the build
time is too long for rapid iteration during testing.

Adding Dockerfile.dev which is a stripped down version of Dockerfile and
it
- minimizes number of installs and builds
- ~~does not write git data~~
- faster image building
- larger image size by not pruning unnecessary fs
- is recommended to build and run image locally

Following are the comparison of Dockerfile and Dockerfile.dev on my
local machine fresh/uncached. It shows ~60% or 8 minute reduction in
build time.

Dockerfile:
```
NC@Chainsafe % docker build -f Dockerfile -t ensi321/lodestar:production .
[+] Building 825.7s (16/16) FINISHED                                                             docker:desktop-linux
 => [internal] load .dockerignore                                                                                0.1s
 => => transferring context: 1.14kB                                                                              0.0s
 => [internal] load build definition from Dockerfile                                                             0.1s
 => => transferring dockerfile: 2.13kB                                                                           0.0s
 => [internal] load metadata for docker.io/library/node:22-slim                                                  5.2s
 => [auth] library/node:pull token for registry-1.docker.io                                                      0.0s
 => [build_src 1/6] FROM docker.io/library/node:22-slim@sha256:0477b569943edd0f0aa24e7881a4d9cba8c23e860802a6b  16.8s
 => => resolve docker.io/library/node:22-slim@sha256:0477b569943edd0f0aa24e7881a4d9cba8c23e860802a6b64bc4f44852  0.0s
 => => sha256:dd29906cc036aabbb7aa0a01f781531434e4fed58eae6cf90364be481e7953c4 47.98MB / 47.98MB                 8.3s
 => => sha256:0477b569943edd0f0aa24e7881a4d9cba8c23e860802a6b64bc4f4485240af11 6.49kB / 6.49kB                   0.0s
 => => sha256:0576f7912bf105a725a9f03fe84f0db764e15144c15a729752a3c3cbf7da5408 1.93kB / 1.93kB                   0.0s
 => => sha256:491218b2b27a64456cd038200e1b7266017b24d533b461618891b178acf039b1 6.56kB / 6.56kB                   0.0s
 => => sha256:4d2547c084994a809c138e688fbe4ee14eedbc6e2defc5b1c680edd16e291473 28.04MB / 28.04MB                 8.8s
 => => sha256:2476b939e8425ff9be0988aab8c0840cd3dd98bd6d23be088bbc335515cb4b5d 3.31kB / 3.31kB                   2.3s
 => => sha256:7a592a8c9f904dfcafed04631b7ca268b545491cfbdc3f076e673eab37864cc0 1.71MB / 1.71MB                   6.1s
 => => sha256:86b77aeb969a46771ef5a94f50ae7e724c7eea48de69f3de4af37c0e4c12445f 448B / 448B                       7.4s
 => => extracting sha256:4d2547c084994a809c138e688fbe4ee14eedbc6e2defc5b1c680edd16e291473                        3.2s
 => => extracting sha256:2476b939e8425ff9be0988aab8c0840cd3dd98bd6d23be088bbc335515cb4b5d                        0.0s
 => => extracting sha256:dd29906cc036aabbb7aa0a01f781531434e4fed58eae6cf90364be481e7953c4                        3.8s
 => => extracting sha256:7a592a8c9f904dfcafed04631b7ca268b545491cfbdc3f076e673eab37864cc0                        0.2s
 => => extracting sha256:86b77aeb969a46771ef5a94f50ae7e724c7eea48de69f3de4af37c0e4c12445f                        0.0s
 => [internal] load build context                                                                               47.6s
 => => transferring context: 1.44GB                                                                             46.3s
 => [build_src 2/6] WORKDIR /usr/app                                                                             1.0s
 => [build_src 3/6] RUN apt-get update && apt-get install -y g++ make python3 python3-setuptools && apt-get cl  36.0s
 => [build_src 4/6] COPY . .                                                                                    28.6s
 => [build_src 5/6] RUN yarn install --non-interactive --frozen-lockfile &&   yarn build &&   yarn install --  302.1s 
 => [build_src 6/6] RUN cd packages/cli && GIT_COMMIT=${COMMIT} yarn write-git-data                              2.0s 
 => [build_deps 4/6] COPY --from=build_src /usr/app .                                                           45.3s 
 => [build_deps 5/6] RUN yarn install --non-interactive --frozen-lockfile --production --force                 216.8s 
 => [build_deps 6/6] RUN cd node_modules/classic-level && yarn rebuild                                          14.1s 
 => [stage-2 3/3] COPY --from=build_deps /usr/app .                                                             50.2s 
 => exporting to image                                                                                          30.9s 
 => => exporting layers                                                                                         30.7s 
 => => writing image sha256:e9c39c3da9512ff3b4c9e04fd13048b929a2756fe9a540d5acd96152275132cd                     0.1s 
 => => naming to docker.io/ensi321/lodestar:production                                                           0.0s
NC@Chainsafe lodestar % docker image list
ensi321/lodestar   production   e9c39c3da951   46 seconds ago   2.07GB
```

Dockerfile.dev:
```
NC@Chainsafe lodestar % docker build -f Dockerfile.dev -t ensi321/lodestar:dev_arm .
[+] Building 282.2s (9/9) FINISHED                                                               docker:desktop-linux
 => [internal] load build definition from Dockerfile.dev                                                         0.1s
 => => transferring dockerfile: 742B                                                                             0.0s
 => [internal] load .dockerignore                                                                                0.1s
 => => transferring context: 1.14kB                                                                              0.0s
 => [internal] load metadata for docker.io/library/node:22                                                       1.8s
 => [1/4] FROM docker.io/library/node:22@sha256:f6b9c31ace05502dd98ef777aaa20464362435dcc5e312b0e213121dcf7d8b9  0.0s
 => [internal] load build context                                                                               26.4s
 => => transferring context: 1.44GB                                                                             25.9s
 => CACHED [2/4] WORKDIR /usr/app                                                                                0.0s
 => [3/4] COPY . .                                                                                              19.0s
 => [4/4] RUN yarn install --non-interactive && yarn build                                                     201.9s
 => exporting to image                                                                                          32.0s 
 => => exporting layers                                                                                         31.8s 
 => => writing image sha256:e36e5ddbf90842804a0473d9373beecad7da3295ebb6b9ddd88e64214a55102e                     0.0s 
 => => naming to docker.io/test/test:0.0.1                                                                       0.1s

NC@Chainsafe lodestar % docker image list
REPOSITORY         TAG       IMAGE ID       CREATED          SIZE
ensi321/lodestar   dev_arm   e36e5ddbf908   About a minute ago   6.24GB
```

---------

Co-authored-by: Nico Flaig <nflaig@protonmail.com>
This commit is contained in:
NC
2025-03-11 12:43:21 -07:00
committed by GitHub
parent ca29dbb8ed
commit 71d195b98a
2 changed files with 20 additions and 0 deletions

19
Dockerfile.dev Normal file
View File

@@ -0,0 +1,19 @@
# Dockerfile.dev is a stripped down version of Dockerfile that is used for development purposes.
# It minimizes number of installs and builds to speed up the development process.
# Run this on local host only.
# Generated image is larger than production image. Do not use this for production.
FROM --platform=${BUILDPLATFORM:-amd64} node:22 AS build_dev
ARG COMMIT
WORKDIR /usr/app
COPY . .
RUN yarn install --non-interactive && yarn build
RUN cd packages/cli && GIT_COMMIT=${COMMIT} yarn write-git-data
ENV NODE_OPTIONS=--max-old-space-size=8192
ENTRYPOINT ["node", "./packages/cli/bin/lodestar"]