Skip to content

Commit 90f0ee8

Browse files
shuhuiluoclaude
andauthored
perf(docker): optimize Docker builds with better layer caching (#4404)
Optimizes Docker build performance by separating dependency installation from source code copying. This prevents `yarn install` from re-running on every source code change. Co-authored-by: Claude <[email protected]>
1 parent b6e816e commit 90f0ee8

File tree

4 files changed

+75
-75
lines changed

4 files changed

+75
-75
lines changed

packages/anvil-docker/Dockerfile

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,12 +51,9 @@ ENV PATH="/root/.foundry/bin:${PATH}"
5151
WORKDIR /app
5252

5353
# Copy package files for dependency installation (layer caching)
54-
COPY ./package.json package.json
55-
COPY ./yarn.lock yarn.lock
56-
COPY ./.yarnrc.yml .yarnrc.yml
57-
COPY ./.yarn/releases .yarn/releases
58-
COPY ./.yarn/plugins .yarn/plugins
59-
COPY ./turbo.json turbo.json
54+
COPY package.json yarn.lock .yarnrc.yml turbo.json ./
55+
COPY .yarn/releases .yarn/releases
56+
COPY .yarn/plugins .yarn/plugins
6057

6158
# Copy workspace package.json files (needed for workspace resolution)
6259
COPY ./protocol/package.json protocol/package.json

packages/stream-metadata/Dockerfile

Lines changed: 38 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -13,44 +13,48 @@ RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash - && \
1313
apt-get install -y nodejs && \
1414
apt-get clean && rm -rf /var/lib/apt/lists/*
1515

16-
# monorepo root config
17-
COPY ./package.json ./package.json
18-
COPY ./.yarn/plugins ./.yarn/plugins
19-
COPY ./.yarn/releases ./.yarn/releases
20-
COPY ./.yarnrc.yml ./.yarnrc.yml
21-
COPY ./buf.yaml ./buf.yaml
22-
COPY ./lerna.json ./lerna.json
23-
COPY ./yarn.lock ./yarn.lock
24-
COPY ./turbo.json ./turbo.json
25-
COPY ./packages/tsconfig.base.json ./packages/tsconfig.base.json
26-
27-
# monorepo core dependencies
28-
COPY ./protocol ./protocol
29-
30-
# monorepo scripts
31-
COPY ./scripts ./scripts
32-
33-
# monorepo packages
34-
COPY ./packages/contracts /river/packages/contracts
35-
COPY ./packages/eslint-config /river/packages/eslint-config
36-
COPY ./packages/prettier-config /river/packages/prettier-config
37-
COPY ./packages/generated /river/packages/generated
38-
COPY ./packages/web3 /river/packages/web3
39-
COPY ./packages/utils /river/packages/utils
40-
COPY ./packages/proto /river/packages/proto
41-
COPY ./packages/sdk /river/packages/sdk
42-
COPY ./packages/encryption /river/packages/encryption
43-
COPY ./packages/sdk-crypto /river/packages/sdk-crypto
44-
COPY ./packages/rpc-connector /river/packages/rpc-connector
45-
COPY ./packages/stream-metadata /river/packages/stream-metadata
46-
47-
# install dependencies and build
16+
# Enable Corepack and install Yarn
4817
RUN corepack enable && \
4918
corepack prepare [email protected] --activate
5019

51-
# Install dependencies
20+
# Copy monorepo configuration for dependency resolution
21+
COPY package.json yarn.lock .yarnrc.yml turbo.json buf.yaml ./
22+
COPY .yarn/releases .yarn/releases
23+
COPY .yarn/plugins .yarn/plugins
24+
COPY packages/tsconfig.base.json ./packages/
25+
26+
# Copy workspace package.json files for dependency resolution
27+
COPY ./packages/stream-metadata/package.json ./packages/stream-metadata/
28+
COPY ./packages/generated/package.json ./packages/generated/
29+
COPY ./packages/contracts/package.json ./packages/contracts/
30+
COPY ./packages/proto/package.json ./packages/proto/
31+
COPY ./packages/sdk/package.json ./packages/sdk/
32+
COPY ./packages/sdk-crypto/package.json ./packages/sdk-crypto/
33+
COPY ./packages/web3/package.json ./packages/web3/
34+
COPY ./packages/utils/package.json ./packages/utils/
35+
COPY ./packages/encryption/package.json ./packages/encryption/
36+
COPY ./packages/rpc-connector/package.json ./packages/rpc-connector/
37+
COPY ./packages/eslint-config/package.json ./packages/eslint-config/
38+
COPY ./packages/prettier-config/package.json ./packages/prettier-config/
39+
COPY ./protocol/package.json ./protocol/
40+
41+
# Install dependencies (cached unless package.json files change)
5242
RUN yarn install && yarn cache clean
53-
RUN yarn run turbo build --filter @towns-protocol/stream-metadata
43+
44+
# Copy remaining source code (only packages needed for build)
45+
COPY ./protocol ./protocol
46+
COPY ./packages/contracts ./packages/contracts
47+
COPY ./packages/generated ./packages/generated
48+
COPY ./packages/proto ./packages/proto
49+
COPY ./packages/sdk ./packages/sdk
50+
COPY ./packages/sdk-crypto ./packages/sdk-crypto
51+
COPY ./packages/web3 ./packages/web3
52+
COPY ./packages/utils ./packages/utils
53+
COPY ./packages/encryption ./packages/encryption
54+
COPY ./packages/rpc-connector ./packages/rpc-connector
55+
COPY ./packages/stream-metadata ./packages/stream-metadata
56+
57+
RUN yarn run turbo build --filter @towns-protocol/stream-metadata...
5458

5559
# create runner image with only the necessary files
5660
FROM node:lts-alpine3.20 AS runner

packages/subgraph/Dockerfile

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,24 +48,21 @@ ENV PATH="/root/.foundry/bin:${PATH}"
4848
# ==========================================
4949

5050
# Copy monorepo configuration for dependency resolution
51-
COPY package.json yarn.lock .yarnrc.yml turbo.json ./
51+
COPY package.json yarn.lock .yarnrc.yml turbo.json buf.yaml ./
5252
COPY .yarn/releases .yarn/releases
5353
COPY .yarn/plugins .yarn/plugins
5454
COPY packages/tsconfig.base.json ./packages/
55-
COPY buf.yaml ./
5655

5756
# Copy workspace package.json files for dependency resolution
57+
COPY packages/contracts/package.json ./packages/contracts/
58+
COPY packages/generated/package.json ./packages/generated/
5859
COPY packages/utils/package.json ./packages/utils/
5960
COPY packages/prettier-config/package.json ./packages/prettier-config/
6061
COPY packages/proto/package.json ./packages/proto/
6162
COPY packages/subgraph/package.json ./packages/subgraph/
6263
COPY packages/web3/package.json ./packages/web3/
6364
COPY protocol/package.json ./protocol/
6465

65-
# Copy packages needed for yarn install (preinstall scripts)
66-
COPY packages/contracts ./packages/contracts/
67-
COPY packages/generated ./packages/generated/
68-
6966
# Install all dependencies (cached unless package.json files change)
7067
RUN yarn install && yarn cache clean
7168

@@ -74,6 +71,8 @@ RUN yarn install && yarn cache clean
7471
# ==========================================
7572

7673
# Copy remaining source code
74+
COPY packages/contracts ./packages/contracts/
75+
COPY packages/generated ./packages/generated/
7776
COPY packages/utils ./packages/utils/
7877
COPY packages/prettier-config ./packages/prettier-config/
7978
COPY packages/proto ./packages/proto/

packages/xchain-monitor/Dockerfile

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -13,40 +13,40 @@ RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash - && \
1313
apt-get install -y nodejs && \
1414
apt-get clean && rm -rf /var/lib/apt/lists/*
1515

16-
# monorepo root config
17-
COPY ./package.json ./package.json
18-
COPY ./.yarn/plugins ./.yarn/plugins
19-
COPY ./.yarn/releases ./.yarn/releases
20-
COPY ./.yarnrc.yml ./.yarnrc.yml
21-
COPY ./buf.yaml ./buf.yaml
22-
COPY ./lerna.json ./lerna.json
23-
COPY ./yarn.lock ./yarn.lock
24-
COPY ./turbo.json ./turbo.json
25-
COPY ./packages/tsconfig.base.json ./packages/tsconfig.base.json
16+
# Enable Corepack and install Yarn
17+
RUN corepack enable && \
18+
corepack prepare [email protected] --activate
2619

27-
# monorepo core dependencies
28-
COPY ./protocol ./protocol
20+
# Copy monorepo configuration for dependency resolution
21+
COPY package.json yarn.lock .yarnrc.yml turbo.json buf.yaml ./
22+
COPY .yarn/releases .yarn/releases
23+
COPY .yarn/plugins .yarn/plugins
24+
COPY packages/tsconfig.base.json ./packages/
2925

30-
# monorepo scripts
31-
COPY ./scripts ./scripts
26+
# Copy workspace package.json files for dependency resolution
27+
COPY ./packages/xchain-monitor/package.json ./packages/xchain-monitor/
28+
COPY ./packages/generated/package.json ./packages/generated/
29+
COPY ./packages/contracts/package.json ./packages/contracts/
30+
COPY ./packages/web3/package.json ./packages/web3/
31+
COPY ./packages/utils/package.json ./packages/utils/
32+
COPY ./packages/proto/package.json ./packages/proto/
33+
COPY ./packages/eslint-config/package.json ./packages/eslint-config/
34+
COPY ./packages/prettier-config/package.json ./packages/prettier-config/
35+
COPY ./protocol/package.json ./protocol/
3236

33-
# monorepo packages
34-
COPY ./packages/contracts /river/packages/contracts
35-
COPY ./packages/eslint-config /river/packages/eslint-config
36-
COPY ./packages/prettier-config /river/packages/prettier-config
37-
COPY ./packages/generated /river/packages/generated
38-
COPY ./packages/utils /river/packages/utils
39-
COPY ./packages/proto /river/packages/proto
40-
COPY ./packages/web3 /river/packages/web3
41-
COPY ./packages/xchain-monitor /river/packages/xchain-monitor
37+
# Install dependencies (cached unless package.json files change)
38+
RUN yarn install && yarn cache clean
4239

43-
# install dependencies and build
44-
RUN corepack enable && \
45-
corepack prepare [email protected] --activate
40+
# Copy remaining source code (only packages needed for build)
41+
COPY ./protocol ./protocol
42+
COPY ./packages/contracts ./packages/contracts
43+
COPY ./packages/generated ./packages/generated
44+
COPY ./packages/proto ./packages/proto
45+
COPY ./packages/web3 ./packages/web3
46+
COPY ./packages/utils ./packages/utils
47+
COPY ./packages/xchain-monitor ./packages/xchain-monitor
4648

47-
# Install dependencies
48-
RUN yarn install && yarn cache clean
49-
RUN yarn run turbo build --filter @towns-protocol/xchain-monitor
49+
RUN yarn run turbo build --filter @towns-protocol/xchain-monitor...
5050

5151
# create runner image with only the necessary files
5252
FROM node:lts-alpine3.20 AS runner

0 commit comments

Comments
 (0)