podman-cp(1) General Commands Manual podman-cp(1)

podman-cp - کپی فایل‌ها یا پوشه‌ها بین کانتینر و سیستم محلی

podman cp [options] [container:]src_path [container:]dest_path

podman container cp [options] [container:]src_path [container:]dest_path

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

کانتینرها می‌توانند در حال اجرا یا متوقف‌شده باشند و src_path یا dest_path می‌تواند یک فایل یا دایرکتوری باشد.

*نکته مهم: دستور podman cp مسیرهای کانتینر را نسبت به دایرکتوری ریشه کانتینر (/) در نظر می‌گیرد؛ بدین معنا که درج اسلش آغازین اختیاری است و بنابراین compassionate_darwin:/tmp/foo/myfile.txt و compassionate_darwin:tmp/foo/myfile.txt را یکسان می‌داند.*

مسیرهای سیستم محلی می‌توانند مقداری مطلق یا نسبی باشند. این دستور، مسیرهای نسبی سیستم محلی را نسبت به دایرکتوری کاری جاری که podman cp در آن اجرا شده است تفسیر می‌کند.

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

src_path یک فایل را مشخص می‌کند:
- dest_path وجود ندارد
- فایل در یک فایل ایجادشده در dest_path ذخیره می‌شود (توجه داشته باشید که دایرکتوری والد باید وجود داشته باشد).
- dest_path وجود دارد و یک فایل است
- مقصد با محتویات فایل مبدا رونویسی می‌شود.
- dest_path وجود دارد و یک دایرکتوری است
- فایل با استفاده از نام پایه (base name) از src_path در این دایرکتوری کپی می‌شود.

src_path یک دایرکتوری را مشخص می‌کند:
- dest_path وجود ندارد
- dest_path به عنوان یک دایرکتوری ایجاد شده و محتویات دایرکتوری مبدا در این دایرکتوری کپی می‌شود.
- dest_path وجود دارد و یک فایل است
- وضعیت خطا: نمی‌توان یک دایرکتوری را روی یک فایل کپی کرد.
- dest_path وجود دارد و یک دایرکتوری است
- src_path با / پایان می‌یابد
- دایرکتوری مبدا درون این دایرکتوری کپی می‌شود.
- src_path با /. پایان می‌یابد (یعنی اسلش و به دنبال آن نقطه)
- محتوای دایرکتوری مبدا درون این دایرکتوری کپی می‌شود.

این دستور ملزم می‌کند که src_path و dest_path بر اساس قوانین بالا وجود داشته باشند.

اگر src_path محلی باشد و یک پیوند نمادین (symbolic link) باشد، به صورت پیش‌فرض هدف نمادین کپی می‌شود.

یک colon ( : ) به عنوان جداکننده بین یک کانتینر و مسیر آن استفاده می‌شود؛ همچنین می‌تواند هنگام مشخص کردن مسیرها برای src_path یا dest_path در سیستم محلی نیز استفاده شود، برای مثال file:name.txt.

*نکته مهم: هنگام استفاده از colon ( : ) در مسیر سیستم محلی، باید با یک مسیر نسبی یا مطلق صریح باشید، برای مثال: /path/to/file:name.txt یا ./file:name.txt*

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

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

علاوه بر این توجه داشته باشید که podman cp از تطبیق الگو (globbing) پشتیبانی نمی‌کند (مانند cp dir/*.txt). برای کپی کردن چندین فایل از میزبان به کانتینر، از xargs(1) یا find(1) (یا ابزارهای مشابه برای زنجیره‌سازی دستورات) همراه با podman cp استفاده کنید. برای کپی کردن چندین فایل از کانتینر به میزبان، از podman mount CONTAINER استفاده کرده و به جای آن روی نقطه اتصال بازگردانده شده عملیات انجام دهید (بخش روش‌های جایگزین در زیر را ببینید).

حالت آرشیو (کپی کردن تمام اطلاعات UID/GID). هنگامی که روی true تنظیم شود، مالکیت فایل‌های کپی‌شده به کانتینر به UID/GID اصلی کانتینر تغییر می‌یابد. هنگامی که روی false تنظیم شود، UID/GID از منابع آرشیو حفظ می‌شود، به جای آنکه به UID/GID اصلی کانتینر مقصد تغییر داده شود. مقدار پیش‌فرض true است.

امکان رونویسی دایرکتوری‌ها با غیر دایرکتوری‌ها و بالعکس را فراهم می‌کند. به صورت پیش‌فرض، podman cp هنگام تلاش برای رونویسی، برای مثال یک فایل معمولی با یک دایرکتوری، با خطا مواجه می‌شود.

دستور Podman قابلیت‌های بسیار قدرتمندتری نسبت به فقط podman cp برای کپی کردن فایل‌ها بین میزبان و کانتینرها دارد.

استفاده از podman-mount(1) و podman-unmount(1) استاندارد امکان بهره‌گیری از کل زنجیره ابزارهای لینوکس را به جای صرفاً cp فراهم می‌کند.

کپی کردن محتویات به بیرون یا داخل یک کانتینر را می‌توان با چند دستور ساده انجام داد. برای مثال:

برای کپی کردن دایرکتوری /etc/foobar از درون یک کانتینر به /tmp روی میزبان، دستورات زیر را می‌توان اجرا کرد:

mnt=$(podman mount CONTAINERID)
cp -R ${mnt}/etc/foobar /tmp
podman umount CONTAINERID

برای استخراج یک فایل tar درون یک کانتینر، دستورات زیر را می‌توان اجرا کرد:

mnt=$(podman mount CONTAINERID)
tar xf content.tgz -C ${mnt}
podman umount CONTAINERID

برای نصب یک بسته درون کانتینری که dnf روی آن نصب نیست، دستورات زیر را می‌توان اجرا کرد:

mnt=$(podman mount CONTAINERID)
dnf install --installroot=${mnt} httpd
chroot ${mnt} rm -rf /var/log/dnf /var/cache/dnf
podman umount CONTAINERID

با استفاده از podman mount و podman unmount، می‌توان از تمام ابزارهای استاندارد لینوکس برای انتقال فایل‌ها به داخل و خارج کانتینرها استفاده کرد، نه فقط دستور cp.

کپی یک فایل از میزبان به یک کانتینر:

podman cp /myapp/app.conf containerID:/myapp/app.conf

کپی یک فایل از یک کانتینر به یک دایرکتوری روی کانتینر دیگر:

podman cp containerID1:/myfile.txt containerID2:/tmp

کپی یک دایرکتوری روی کانتینر به دایرکتوری روی میزبان:

podman cp containerID:/myapp/ /myapp/

کپی محتویات یک دایرکتوری روی کانتینر به دایرکتوری روی میزبان:

podman cp containerID:/home/myuser/. /home/myuser/

کپی یک دایرکتوری روی کانتینر به دایرکتوری روی کانتینر دیگر:

podman cp containerA:/myapp containerB:/newapp

استریم یک آرشیو tar از STDIN به یک کانتینر:

podman cp - containerID:/myfiles.tar.gz < myfiles.tar.gz

podman(1), podman-mount(1), podman-unmount(1)