DOCKER(1) Docker User Manuals DOCKER(1)

docker-container-cp - رونوشت فایل‌ها/پوشه‌ها میان کانتینر و فایل‌سیستم محلی

docker container cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|- docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH

ابزار docker container cp محتویات SRC_PATH را به DEST_PATH کپی می‌کند. شما می‌توانید از فایل‌سیستم کانتینر به ماشین محلی یا برعکس، از فایل‌سیستم محلی به کانتینر کپی کنید. اگر برای SRC_PATH یا DEST_PATH مقدار - مشخص شود، می‌توانید یک آرشیو tar را از STDIN دریافت کرده یا به STDOUT ارسال کنید. کانتینر CONTAINER می‌تواند در حال اجرا یا متوقف باشد. مقدار SRC_PATH یا DEST_PATH می‌تواند یک فایل یا دایرکتوری باشد.

دستور docker container cp فرض می‌کند مسیرهای کانتینر نسبت به دایرکتوری ریشه (/) کانتینر هستند. این یعنی ذکر اسلش ابتدایی اختیاری است؛ دستور، دو مسیر compassionate_darwin:/tmp/foo/myfile.txt و compassionate_darwin:tmp/foo/myfile.txt را یکسان می‌داند. مسیرهای ماشین محلی می‌توانند مقداری مطلق یا نسبی باشند. این دستور مسیرهای نسبی ماشین محلی را نسبت به دایرکتوری کاری فعلی که docker container cp در آن اجرا می‌شود تفسیر می‌کند.

دستور cp مشابه با دستور یونیکس cp -a عمل می‌کند؛ به این صورت که دایرکتوری‌ها به‌صورت بازگشتی و در صورت امکان با حفظ دسترسی‌ها کپی می‌شوند. مالکیت روی کاربر و گروه اصلی در مقصد تنظیم می‌شود. برای نمونه، فایل‌هایی که در یک کانتینر کپی می‌شوند با شناسه کاربری و گروهی (UID:GID) کاربر root ایجاد می‌شوند. فایل‌هایی که در ماشین محلی کپی می‌شوند با شناسه کاربری و گروهی (UID:GID) کاربری که دستور docker container cp را اجرا کرده ایجاد می‌گردند. اگر گزینه -L را مشخص کنید، دستور docker container cp پیوندهای نمادین موجود در SRC_PATH را دنبال می‌کند. دستور docker container cp در صورت عدم وجود دایرکتوری‌های والد DEST_PATH، آن‌ها را ایجاد نمی‌کند.

با فرض جداکننده مسیر /، آرگومان اول SRC_PATH و آرگومان دوم DEST_PATH، رفتار دستور به شرح زیر است:

•
مقدار SRC_PATH یک فایل را مشخص می‌کند
•
مقدار DEST_PATH وجود ندارد
•
فایل در قالب یک فایل جدید در DEST_PATH ذخیره می‌شود
•
مقدار DEST_PATH وجود ندارد و به / ختم می‌شود
•
شرایط خطا: دایرکتوری مقصد باید وجود داشته باشد.
•
مقدار DEST_PATH وجود دارد و یک فایل است
•
مقصد با محتویات فایل مبدأ رونویسی (overwrite) می‌شود
•
مقدار DEST_PATH وجود دارد و یک دایرکتوری است
•
فایل با استفاده از نام پایه (basename) برگرفته از SRC_PATH درون این دایرکتوری کپی می‌شود
•
مقدار SRC_PATH یک دایرکتوری را مشخص می‌کند
•
مقدار DEST_PATH وجود ندارد
•
مسیر DEST_PATH به عنوان یک دایرکتوری ایجاد شده و محتویات دایرکتوری مبدأ درون این دایرکتوری کپی می‌شود
•
مقدار DEST_PATH وجود دارد و یک فایل است
•
شرایط خطا: نمی‌توان یک دایرکتوری را در یک فایل کپی کرد
•
مقدار DEST_PATH وجود دارد و یک دایرکتوری است
•
مسیر SRC_PATH به /. ختم نمی‌شود (یعنی: اسلش به همراه نقطه)
•
دایرکتوری مبدأ به درون این دایرکتوری کپی می‌شود
•
مسیر SRC_PATH به /. ختم می‌شود (یعنی: اسلش به همراه نقطه)
•
محتویات دایرکتوری مبدأ درون این دایرکتوری کپی می‌شود

این دستور نیازمند آن است که SRC_PATH و DEST_PATH طبق قوانین بالا وجود داشته باشند. اگر SRC_PATH محلی باشد و یک پیوند نمادین باشد، به صورت پیش‌فرض خود پیوند نمادین کپی می‌شود و نه مقصد آن. برای کپی کردن مقصد پیوند و نه خود پیوند، گزینه -L را مشخص کنید.

یک دونقطه (:) به عنوان جداکننده میان CONTAINER و مسیر آن استفاده می‌شود. شما همچنین می‌توانید از : هنگام تعیین مسیرهای SRC_PATH یا DEST_PATH در یک ماشین محلی استفاده کنید، برای مثال file:name.txt. اگر در مسیر ماشین محلی از : استفاده می‌کنید، باید مسیر را به صورت صریح با یک مسیر نسبی یا مطلق مشخص نمایید، مانند:

`/path/to/file:name.txt` or `./file:name.txt`

امکان کپی کردن برخی فایل‌های سیستمی خاص نظیر منابع موجود در /proc، /sys، /dev، tmpfs، و مانت‌های ایجادشده توسط کاربر در کانتینر وجود ندارد. با این حال، شما همچنان می‌توانید چنین فایل‌هایی را با اجرای دستی tar در docker exec کپی کنید. برای نمونه (فرض کنید SRC_PATH و DEST_PATH دایرکتوری هستند):

$ docker exec foo tar Ccf $(dirname SRC_PATH) - $(basename SRC_PATH) | tar Cxf DEST_PATH -

یا

$ tar Ccf $(dirname SRC_PATH) - $(basename SRC_PATH) | docker exec -i foo tar Cxf DEST_PATH -

استفاده از - به عنوان SRC_PATH محتویات STDIN را به صورت یک آرشیو tar جریان می‌دهد (stream). این دستور محتوای tar را در DEST_PATH درون فایل‌سیستم کانتینر استخراج می‌کند. در این حالت، DEST_PATH باید یک دایرکتوری را مشخص کند. استفاده از - به عنوان DEST_PATH محتویات منبع را به صورت یک آرشیو tar به STDOUT می‌فرستد.

فرض کنید کانتینری تولید خروجی خود را به عنوان فایلی در جایی از فایل‌سیستمش به پایان رسانده است. این می‌تواند خروجی یک فرایند ساخت (build job) یا محاسبات دیگری باشد. شما می‌توانید این خروجی‌ها را از کانتینر به مکانی روی میزبان محلی خود کپی کنید.

اگر می‌خواهید دایرکتوری /tmp/foo را از یک کانتینر در دایرکتوری موجود /tmp روی میزبان خود کپی کنید، در صورتی که docker container cp را در دایرکتوری خانگی (~) خود روی میزبان محلی اجرا کنید:

$ docker container cp compassionate_darwin:tmp/foo /tmp

داکر یک دایرکتوری به نام /tmp/foo روی میزبان شما ایجاد می‌کند. از طرف دیگر، می‌توانید اسلش ابتدایی را در دستور حذف کنید. اگر این دستور را از دایرکتوری خانگی خود اجرا کنید:

$ docker container cp compassionate_darwin:tmp/foo tmp

اگر ~/tmp وجود نداشته باشد، داکر آن را ایجاد کرده و محتویات /tmp/foo را از کانتینر درون این دایرکتوری جدید کپی می‌کند. اگر ~/tmp از قبل به صورت یک دایرکتوری وجود داشته باشد، داکر محتویات /tmp/foo را از کانتینر درون دایرکتوری ~/tmp/foo کپی خواهد کرد.

هنگام کپی کردن یک فایل تکی به یک LOCALPATH موجود، دستور docker container cp در صورتی که LOCALPATH یک فایل باشد محتویات آن را بازنویسی می‌کند و اگر یک دایرکتوری باشد فایل را در LOCALPATH قرار می‌دهد؛ و چنانچه فایلی با همان نام از قبل موجود باشد آن را بازنویسی می‌نماید. برای مثال در این دستور:

$ docker container cp sharp_ptolemy:/tmp/foo/myfile.txt /test

اگر /test روی ماشین محلی وجود نداشته باشد، به عنوان فایلی با محتویات /tmp/foo/myfile.txt کانتینر ایجاد خواهد شد. اگر /test به صورت یک فایل وجود داشته باشد، بازنویسی می‌شود. در نهایت، اگر /test یک دایرکتوری باشد، فایل در مسیر /test/myfile.txt کپی خواهد شد.

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

اگر فایلی به نام config.yml در دایرکتوری جاری میزبان محلی خود دارید و می‌خواهید آن را در دایرکتوری موجود /etc/my-app.d درون یک کانتینر کپی کنید، می‌توان از این دستور استفاده کرد:

$ docker container cp config.yml myappcontainer:/etc/my-app.d

اگر چندین فایل در دایرکتوری محلی /config دارید که می‌خواهید آن‌ها را در دایرکتوری /etc/my-app.d درون یک کانتینر کپی کنید:

$ docker container cp /config/. myappcontainer:/etc/my-app.d

دستور بالا محتویات دایرکتوری محلی /config را درون دایرکتوری /etc/my-app.d کانتینر کپی می‌کند.

در نهایت، اگر می‌خواهید یک پیوند نمادین را درون کانتینر کپی کنید، معمولاً مایل هستید مقصد پیوند را کپی کنید نه خود پیوند را. برای کپی کردن مقصد، از گزینه -L استفاده کنید، به عنوان مثال:

$ ln -s /tmp/somefile /tmp/somefile.ln
$ docker container cp -L /tmp/somefile.ln myappcontainer:/tmp/

این دستور محتوای فایل محلی /tmp/somefile را درون فایل /tmp/somefile.ln در کانتینر کپی می‌کند. بدون گزینه -L، فایل /tmp/somefile.ln ساختار پیوند نمادین خود را حفظ می‌کند اما محتوای آن کپی نمی‌شود.

-a, --archive[=false] حالت آرشیو (کپی تمام اطلاعات uid/gid)

-L, --follow-link[=false] همیشه پیوندهای نمادین در SRC_PATH دنبال شوند

-q, --quiet[=false] سرکوب نمایش پیشرفت در حین کپی. در صورت عدم اتصال ترمینال، نمایش پیشرفت به طور خودکار متوقف می‌شود

docker-container(1)

Aug 2026 Docker Community