هر دستور، یک لایه
داکر هر image را از لایههای متعدد (layers) میسازد؛ هر دستور در Dockerfile معمولاً یک لایهی جدید تولید میکند. این لایهها روی هم قرار میگیرند و یک فایلسیستم واحد تشکیل میدهند. مزیت بزرگ این معماری، امکان اشتراکگذاری لایهها بین ایمیجهای مختلف و کش شدن آنهاست: اگر یک لایه تغییر نکرده باشد، داکر آن را دوباره نمیسازد و از کش استفاده میکند.
به همین دلیل، ترتیب دستورات در Dockerfile اهمیت زیادی دارد. لایههایی که کمتر تغییر میکنند (مثل نصب وابستگیها) باید زودتر بیایند و لایههایی که زیاد تغییر میکنند (مثل کد خود برنامه) باید در انتها قرار بگیرند:
# درست: وابستگیها قبل از کد
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
# نادرست: هر تغییر کد، نصب مجدد وابستگیها را هم اجبار میکند
COPY . .
RUN pip install -r requirements.txt
در حالت دوم، حتی یک تغییر کوچک در کد برنامه باعث میشود کش لایهی COPY . . باطل شود و در نتیجه لایهی RUN pip install هم دوباره از صفر اجرا شود، چون داکر لایهها را بهترتیب و بر اساس تغییر لایهی قبلی نامعتبر میکند. رعایت این ترتیب در پروژههای واقعی میتواند زمان ساخت image را از چند دقیقه به چند ثانیه کاهش دهد و فرایند توسعه را بهطور محسوسی سریعتر کند.