مشکل رو با AI بررسی کردم و فهمیدم مشکل از ترتیب چند خط در Dockerfile بوده است!
من این اشتباه رو در 90٪ پروژههام انجام داده بودم؛ اشتباهی که هر روز چند دقیقه و گاها چند ساعت از زمانم رو هدر داده.
به دنبال بررسی بیشتر موضوع ترتیب دستورات در Dockerfile؛ رسیدم به مفهوم Docker build cache.
اگر ترتیب دستورات در Dockerfile شما شبیه این هستش:
COPY . .
RUN npm install
هر بار که حتی یک خط از app.js یا هر فایل دیگهای رو تغییر بدین، Docker مجبور میشه دوباره مرحلهی
npm install رو اجرا کنه.در حالی که وابستگیهای پروژه اصلاً تغییر نکردند!
دلیلش چیه؟
داکر Image رو به صورت لایه به لایه میسازه و هر دستور در Dockerfile یک Layer جدید ایجاد میکنه.
اگر یک Layer تغییر کنه، خود اون Layer به همراه تمام Layerهای بعدیش دوباره ساخته میشن.
به همین دلیل، این ترتیب در Dockerfile بسیار بهینهتر هستش:
COPY package*.json ./
RUN npm install
COPY . .
چون فایلهای`package.json` و
package-lock.json معمولاً کمتر از سورس پروژه تغییر میکنند.بنابراین Docker میتونه Layer مربوط به نصب پکیجها رو Cache کنه و در Buildهای بعدی، اگر فقط کد برنامه تغییر کرده باشد، فقط سورس کد رو کپی کنه و دیگه npm install رو ران نکنه.
نتیجه؟
مصرف کمتر CPU و Disk و Build سریعتر
این اصل فقط مخصوص Node.js نیست و در همه اکوسیستمها وجود داره؛ مثلا در پایتون اول باید فایل requirements.txt کپی بشه و pip install انجام بشه و بعدا سورس کد پروژه کپی بشه.
فایلهایی که کمتر تغییر میکنند رو زودتر کپی کنید و دستور کپی فایلهایی که بیشتر تغییر میکنند رو در انتهای Dockerfile قرار بدین.
گاهی بهینهسازی یعنی اضافه کردن تکنولوژی جدید.
اما گاهی فقط یعنی ترتیب دو خط کد را عوض کنید
داکیومنت داکر در رابطه با این موضوع:
https://docs.docker.com/build/cache/
@DevTwitter | <Razie RezaAli/>