حسام جعفرزاده
حسام جعفرزاده
خواندن ۲ دقیقه·۳ سال پیش

استفاده از دستور ADD یا COPY ؟ مسئله این است !

دستور add و copy در داکرفایل
دستور add و copy در داکرفایل


به احتمال خیلی قوی، اگر که با Dockerfile کار کرده باشید، دستور‌های ADD و COPY به چشمتان خورده‌اند...

اما،‌ تفاوت این دو دستور، در چیست ؟ و از کدام یک باید استفاده کنیم؟


اجازه دهید که با یک توضیح بسیار کلی شروع کنیم. هر دو دستور، کار یکسان کپی کردن فایل‌ها از یک آدرس به یک کانتینر را دارند.

دستور COPY یک آدرس را به عنوان مبدا (src) و یک آدرس را به عنوان مقصد(dest) دریافت می‌کند و محتویات مبدا را درون مقصد ( که آدرسی درون image هست ) کپی می‌کند.

توجه کنید که در دستور COPY آدرس مبدا، باید محلی در هاست یا کامپیوتر شما باشد و نمی‌تواند یک آدرس روی فضای اینترنت باشد.

COPY <src> <dest>


دستور ADD هم به همین شکل عمل می‌کند اما ۲ تفاوت با دستور COPY دارد:

  • اولین تفاوت اینکه،‌ در این دستور شما اجازه دارید آدرس مبدا را جایی به جز سیستم خودتان تعیین کنید. (مثلا آدرس یک فایل روی یک سرور)
  • و دومین تفاوت اینکه، این دستور به طور پیش فرض فایل‌های فشرده‌ را در محل مقصد extract می‌کند.


و اما نکات بسیار مهمی که نباید آنها را نادیده بگیریم:

یک:‌ زمان استفاده از دستور ADD برای extract فایل‌های فشرده شده، این فایل‌ها (tar) باید به صورت لوکالی باشند و نمی‌توانند روی یک remote آدرس باشند.

دو: اگر قرار است که یکی از دستورات Dockerfile مان،وظیفه‌ی کپی کردن یکسری فایل از سیستم به image را برعهده داشته باشد و در داخل این فایل‌ها، فایلی قرار داشته باشد که باعث تغییراتی عمده و کلیدی در ساخت image می‌شود بهتر است که آنرا به صورت جداگانه کپی کنیم، به طور مثال اگر قرار است فایل‌های یک پروژه‌ی نود‌جی‌اس را درون image کپی کنیم، بهتر است فایل package.json را که لیست پکیج‌ها و کانفیگ‌های مورد نیاز پروژه را در خود دارد، به صورت جداگانه کپی کنیم و بعد از اینکه دستور npm install را اجرا کردیم ما بقی فایل‌های پروژه را کپی کنیم.

اما چرا؟ زیرا ‌در اجرای هر دستور از Dockerfile، یک لایه و کش برای آن در نظر گرفته می‌شود و این کار باعث می‌شود که اگر فایل package.json را تغییر دادیم، تنها لایه‌های مرتبط با این تغییر، مجدد اجرا شوند و در نتیجه کش‌های کمتری که وابسته به این لایه‌ها هستند به روزرسانی شوند (نسبت به حالتی که ابتدا تمام فایل‌ها کپی شوند) و مابقی فایل‌ها که بعد دستور install، کپی کردیم بدون تغییر بمانند.

پس، این حالت شاید اجرا شود، اما کاملا درست و منطقی نیست:

FROM node:alpine-lts COPY . . RUN npm install ....

و شیوه‌ی صحیح نوشتن:

FROM node:alpine-lts COPY package.json RUN npm install COPY . . ...

در شرایط یکسان کدام را استفاده کنیم ؟‌

طبق داکیومنت داکر،‌ در شرایطی که استفاده از این دستور‌ها تفاوتی ندارد بهتر است که از COPY استفاده کنید و تنها در صورت نیاز به توانایی‌های دستور ADD،‌ آنرا به کار ببریم.


بسیار خوشحال میشم که نظرات شما رو هم بدونم.

داکرداکرفایلداکرکامپوزکانتینرایمیج
به دنبال یادگیری بیشتر - اطلاعات بیشتر در مورد من در: hesij.ir
شاید از این پست‌ها خوشتان بیاید