به احتمال خیلی قوی، اگر که با Dockerfile کار کرده باشید، دستورهای ADD و COPY به چشمتان خوردهاند...
اما، تفاوت این دو دستور، در چیست ؟ و از کدام یک باید استفاده کنیم؟
اجازه دهید که با یک توضیح بسیار کلی شروع کنیم. هر دو دستور، کار یکسان کپی کردن فایلها از یک آدرس به یک کانتینر را دارند.
دستور COPY یک آدرس را به عنوان مبدا (src) و یک آدرس را به عنوان مقصد(dest) دریافت میکند و محتویات مبدا را درون مقصد ( که آدرسی درون image هست ) کپی میکند.
توجه کنید که در دستور COPY آدرس مبدا، باید محلی در هاست یا کامپیوتر شما باشد و نمیتواند یک آدرس روی فضای اینترنت باشد.
COPY <src> <dest>
دستور ADD هم به همین شکل عمل میکند اما ۲ تفاوت با دستور COPY دارد:
یک: زمان استفاده از دستور 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، آنرا به کار ببریم.
بسیار خوشحال میشم که نظرات شما رو هم بدونم.