Skip to content

Build Cache Optimization 🚀 ​

āĻĄāĻ•āĻžāϰ āχāĻŽā§‡āϜ āĻŦāĻŋāĻ˛ā§āĻĄ āĻ•āϰāĻžāϰ āϏāĻŽā§Ÿ āϏāĻŽā§Ÿā§‡āϰ āĻ…āĻĒāϚ⧟ āĻ•āĻŽāĻžāϤ⧇ āĻāĻŦāĻ‚ āĻāĻĢāĻŋāĻļāĻŋā§Ÿā§‡āĻ¨ā§āϏāĻŋ āĻŦāĻžā§œāĻžāϤ⧇ Build Cache Optimization āĻ…āĻ¤ā§āϝāĻ¨ā§āϤ āϗ⧁āϰ⧁āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖāĨ¤ āϏāĻ āĻŋāĻ• āωāĻĒāĻžā§Ÿā§‡ āĻ•ā§āϝāĻžāĻļ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϞ⧇ āĻ•ā§Ÿā§‡āĻ• āĻŽāĻŋāύāĻŋāĻŸā§‡āϰ āĻŦāĻŋāĻ˛ā§āĻĄ āĻĒā§āϰāϏ⧇āϏ āĻŽāĻžāĻ¤ā§āϰ āĻ•ā§Ÿā§‡āĻ• āϏ⧇āϕ⧇āĻ¨ā§āĻĄā§‡ āύāĻžāĻŽāĻŋā§Ÿā§‡ āφāύāĻž āϏāĻŽā§āĻ­āĻŦāĨ¤


ā§§. āĻĄāĻ•āĻžāϰ āϞ⧇āϝāĻŧāĻžāϰ āĻ•ā§āϝāĻžāĻļāĻŋāĻ‚ (Layer Caching) ​

āĻĄāĻ•āĻžāϰ āĻĒā§āϰāϤāĻŋāϟāĻŋ āχāĻ¨ā§āϏāĻŸā§āϰāĻžāĻ•āĻļāύāϕ⧇ (RUN, COPY, ADD) āĻāĻ•āϟāĻŋ āφāϞāĻžāĻĻāĻž āĻ˛ā§‡ā§ŸāĻžāϰ āĻšāĻŋāϏ⧇āĻŦ⧇ āϏ⧇āĻ­ āĻ•āϰ⧇āĨ¤

  • āϝāĻ–āύ āφāĻĒāύāĻŋ āĻĒ⧁āύāϰāĻžā§Ÿ āĻŦāĻŋāĻ˛ā§āĻĄ āĻ•āϰ⧇āύ, āĻĄāĻ•āĻžāϰ āĻšā§‡āĻ• āĻ•āϰ⧇ āĻĻ⧇āϖ⧇ āϏ⧇āχ āĻ˛ā§‡ā§ŸāĻžāϰ⧇ āϕ⧋āύ⧋ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻšā§Ÿā§‡āϛ⧇ āĻ•āĻŋāύāĻžāĨ¤
  • āϝāĻĻāĻŋ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āύāĻž āĻšā§Ÿ, āϤāĻŦ⧇ āĻĄāĻ•āĻžāϰ āφāϗ⧇āϰ āĻœā§‡āύāĻžāϰ⧇āϟ āĻ•āϰāĻž āĻ•ā§āϝāĻžāĻļ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇āĨ¤
  • āĻŽāύ⧇ āϰāĻžāĻ–āĻŦ⧇āύ: āϝāĻĻāĻŋ āϕ⧋āύ⧋ āĻ˛ā§‡ā§ŸāĻžāϰ⧇āϰ āĻ•ā§āϝāĻžāĻļ āχāύāĻ­ā§āϝāĻžāϞāĻŋāĻĄ (Invalid) āĻšā§Ÿ, āϤāĻŦ⧇ āϤāĻžāϰ āĻĒāϰ⧇āϰ āϏāĻŦ āĻ˛ā§‡ā§ŸāĻžāϰ āĻĒ⧁āύāϰāĻžā§Ÿ āĻŦāĻŋāĻ˛ā§āĻĄ āĻšāĻŦ⧇āĨ¤

⧍. āĻ•ā§āϝāĻžāĻļ āĻŽāĻžāωāĻ¨ā§āϟāĻŋāĻ‚ (Cache Mounting) ​

BuildKit-āĻāϰ āĻāĻ•āϟāĻŋ āĻĒāĻžāĻ“ā§ŸāĻžāϰāĻĢ⧁āϞ āĻĢāĻŋāϚāĻžāϰ āĻšāϞ⧋ type=cache āĻŽāĻžāωāĻ¨ā§āϟāĨ¤ āĻāϟāĻŋ āĻŦāĻŋāĻļ⧇āώ āĻ•āϰ⧇ āĻĒā§āϝāĻžāϕ⧇āϜ āĻŽā§āϝāĻžāύ⧇āϜāĻžāϰāϗ⧁āϞ⧋āϰ (pip, npm, apt) āϜāĻ¨ā§āϝ āϖ⧁āĻŦ āĻ•āĻžāĻ°ā§āϝāĻ•āϰāĨ¤

dockerfile
# Pip-āĻāϰ āϜāĻ¨ā§āϝ āĻ•ā§āϝāĻžāĻļ āĻŽāĻžāωāĻ¨ā§āϟ āωāĻĻāĻžāĻšāϰāĻŖ
RUN --mount=type=cache,target=/root/.cache/pip \
    pip install -r requirements.txt

āϏ⧁āĻŦāĻŋāϧāĻž: āϝāĻĻāĻŋ āφāĻĒāύāĻŋ requirements.txt-āĻ āĻāĻ•āϟāĻŋ āύāϤ⧁āύ āĻĒā§āϝāĻžāϕ⧇āϜ āϝ⧋āĻ— āĻ•āϰ⧇āύ, āϤāĻŦ⧇ āĻĄāĻ•āĻžāϰ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āϏ⧇āχ āĻĒā§āϝāĻžāϕ⧇āϜāϟāĻŋ āĻĄāĻžāωāύāϞ⧋āĻĄ āĻ•āϰāĻŦ⧇, āφāϗ⧇āϰ āĻĒā§āϝāĻžāϕ⧇āϟāϗ⧁āϞ⧋ āĻ•ā§āϝāĻžāĻļ āĻĨ⧇āϕ⧇ āύāĻŋā§Ÿā§‡ āύ⧇āĻŦ⧇āĨ¤


ā§Š. āĻŽāĻžāĻ˛ā§āϟāĻŋ-āĻ¸ā§āĻŸā§‡āϜ āĻ•ā§āϝāĻžāĻļāĻŋāĻ‚ (Multi-stage Caching) ​

āĻŽāĻžāĻ˛ā§āϟāĻŋ-āĻ¸ā§āĻŸā§‡āϜ āĻŦāĻŋāĻ˛ā§āĻĄā§‡ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āĻĢāĻžāχāύāĻžāϞ āĻ¸ā§āĻŸā§‡āĻœā§‡āϰ āχāĻŽā§‡āϜ āĻœā§‡āύāĻžāϰ⧇āϟ āĻšā§ŸāĨ¤ āĻ•āĻŋāĻ¨ā§āϤ⧁ BuildKit āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϞ⧇ āφāĻĒāύāĻŋ āχāĻ¨ā§āϟāĻžāϰāĻŽāĻŋāĻĄāĻŋā§Ÿā§‡āϟ āĻ¸ā§āĻŸā§‡āϜāϗ⧁āϞ⧋āϕ⧇āĻ“ āĻ•ā§āϝāĻžāĻļ āĻšāĻŋāϏ⧇āĻŦ⧇ āĻ¸ā§āĻŸā§‹āϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤


ā§Ē. āĻ•ā§āϝāĻžāĻļ āχāύāĻ­ā§āϝāĻžāϞāĻŋāĻĄā§‡āĻļāύ (Cache Invalidation) ​

āĻ•ā§āϝāĻžāĻļ āĻ•āĻ–āύ āĻ•āĻžāϜ āĻ•āϰāĻŦ⧇ āύāĻž?

  • COPY . . āĻ•āϰāĻžāϰ āϏāĻŽā§Ÿ āϝāĻĻāĻŋ āϕ⧋āύ⧋ āĻĢāĻžāχāϞ⧇ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻšā§ŸāĨ¤
  • āϕ⧋āύ⧋ RUN āĻ•āĻŽāĻžāĻ¨ā§āĻĄā§‡āϰ āφāϗ⧇ āϝāĻĻāĻŋ āĻ…āĻ¨ā§āϝ āϕ⧋āύ⧋ āĻ˛ā§‡ā§ŸāĻžāϰ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻšā§ŸāĨ¤

āĻŦ⧇āĻ¸ā§āϟ āĻĒā§āĻ°ā§āϝāĻžāĻ•āϟāĻŋāϏ: āĻĄāĻ•āĻžāϰāĻĢāĻžāχāϞ⧇ āϏāĻŦ āϏāĻŽā§Ÿ āϏ⧇āχ āĻĢāĻžāχāϞāϗ⧁āϞ⧋ āφāϗ⧇ āĻ•āĻĒāĻŋ āĻ•āϰ⧁āύ āϝāĻž āϘāύāϘāύ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻšā§Ÿ āύāĻž (āϝ⧇āĻŽāύ: package.json āĻŦāĻž go.mod)āĨ¤

dockerfile
# āĻ­āĻžāϞ⧋ āĻĒā§āĻ°ā§āϝāĻžāĻ•āϟāĻŋāϏ
COPY package.json .
RUN npm install
COPY . .

ā§Ģ. āϰāĻŋāĻŽā§‹āϟ āĻ•ā§āϝāĻžāĻļ (Remote Cache) ​

CI/CD āĻĒāĻžāχāĻĒāϞāĻžāχāύ⧇ āĻ•āĻžāϜ āĻ•āϰāĻžāϰ āϏāĻŽā§Ÿ āĻāĻ• āĻŦāĻŋāĻ˛ā§āĻĄā§‡āϰ āĻ•ā§āϝāĻžāĻļ āĻ…āĻ¨ā§āϝ āĻŦāĻŋāĻ˛ā§āĻĄā§‡ āĻĒāĻžāĻ“ā§ŸāĻž āϝāĻžā§Ÿ āύāĻž āĻ•āĻžāϰāĻŖ āĻĒā§āϰāϤāĻŋāĻŦāĻžāϰ āĻāĻ•āϟāĻŋ āύāϤ⧁āύ āĻāύāĻ­āĻžā§ŸāϰāύāĻŽā§‡āĻ¨ā§āϟ āϤ⧈āϰāĻŋ āĻšā§ŸāĨ¤ BuildKit-āĻāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āφāĻĒāύāĻŋ āφāĻĒāύāĻžāϰ āχāĻŽā§‡āϜ āϰ⧇āϜāĻŋāĻ¸ā§āĻŸā§āϰāĻŋāϤ⧇ (Docker Hub/GHCR) āĻ•ā§āϝāĻžāĻļ āĻĒ⧁āĻļ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤

bash
docker buildx build --push \
  --cache-from=user/app:cache \
  --cache-to=user/app:cache,mode=max \
  -t user/app:latest .

āϏāĻžāϰāϏāĻ‚āĻ•ā§āώ⧇āĻĒ (Summary) ​

āĻŦāĻŋāĻ˛ā§āĻĄ āĻ•ā§āϝāĻžāĻļ āĻ…āĻĒā§āϟāĻŋāĻŽāĻžāχāĻœā§‡āĻļāύ āφāĻĒāύāĻžāϰ āĻĄā§‡āĻ­āϞāĻĒāĻŽā§‡āĻ¨ā§āϟ āϞāĻžāχāĻĢāϏāĻžāχāϕ⧇āϞāϕ⧇ āĻ…āύ⧇āĻ• āĻŦ⧇āĻļāĻŋ āĻĢāĻžāĻ¸ā§āϟ āĻ•āϰ⧇āĨ¤ āĻ˛ā§‡ā§ŸāĻžāϰāĻŋāĻ‚ āĻ…āĻ°ā§āĻĄāĻžāϰ āĻāĻŦāĻ‚ BuildKit-āĻāϰ āĻ•ā§āϝāĻžāĻļ āĻŽāĻžāωāĻ¨ā§āϟ āĻĢāĻŋāϚāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻĒā§āϰāĻĢ⧇āĻļāύāĻžāϞ āĻĄāĻ•āĻžāϰ āχāωāϜāĻžāϰ⧇āϰ āϜāĻžāύāĻž āωāϚāĻŋāϤāĨ¤


IMPORTANT

āϏāĻŦ āϏāĻŽā§Ÿ .dockerignore āĻĢāĻžāχāϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ āϝāĻžāϤ⧇ āĻ…āĻĒā§āĻ°ā§Ÿā§‹āϜāĻ¨ā§€ā§Ÿ āĻĢāĻžāχāϞ (āϝ⧇āĻŽāύ: node_modules, .git) āĻ•ā§āϝāĻžāĻļ āχāύāĻ­ā§āϝāĻžāϞāĻŋāĻĄ āύāĻž āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤

Released under the MIT License.