نحوه استفاده از docker exec برای اجرای دستورات در یک Docker Container

مقدمه

Docker یک ابزار کانتینری‌سازی است که به توسعه‌دهندگان کمک می‌کند تا کانتینرهای قابل حمل و سازگار لینوکس را ایجاد و مدیریت کنند.

هنگام توسعه یا استقرار کانتینرها، اغلب باید به داخل یک کانتینر در حال اجرا نگاه کنید تا وضعیت فعلی آن را بررسی کنید یا مشکلی را رفع کنید. برای این منظور، Docker دستور docker exec را برای اجرای برنامه‌ها در کانتینرهای در حال اجرا ارائه می‌کند.

در این آموزش با دستور docker exec و نحوه استفاده از آن برای اجرای دستورات و دریافت یک پوسته تعاملی در یک ظرف داکر آشنا می شویم.

پیش نیازها

این آموزش فرض می کند که شما قبلاً Docker را نصب کرده اید و کاربر شما اجازه اجرای docker را دارد. اگر نیاز به اجرای docker به عنوان کاربر اصلی دارید، لطفاً به یاد داشته باشید که sudo را به دستورات این آموزش اضافه کنید.

برای اطلاعات بیشتر در مورد استفاده از Docker بدون دسترسی sudo، لطفاً بخش اجرای دستور Docker بدون سودو را در آموزش نحوه نصب Docker ما ببینید.

راه اندازی کانتینر تست

برای استفاده از دستور docker exec، به یک کانتینر داکر در حال اجرا نیاز دارید. اگر قبلاً یک کانتینر ندارید، یک کانتینر آزمایشی را با دستور اجرای docker زیر شروع کنید:

docker run -d --name container-name alpine watch "date >> /var/log/date.log"

این دستور یک ظرف Docker جدید از تصویر رسمی آلپاین ایجاد می کند. این یک تصویر محفظه لینوکس محبوب است که از Alpine Linux استفاده می کند، یک توزیع سبک وزن و حداقل لینوکس.

ما از پرچم -d برای جدا کردن کانتینر از ترمینال و اجرای آن در پس‌زمینه استفاده می‌کنیم. –name container-name نام کانتینر را نامگذاری می کند. شما می توانید هر نامی را که دوست دارید در اینجا انتخاب کنید یا این را کاملاً کنار بگذارید تا Docker به طور خودکار یک نام منحصر به فرد برای کانتینر جدید ایجاد کند.

بعد alpine داریم که تصویری را که می خواهیم برای کانتینر استفاده کنیم را مشخص می کند.

و در نهایت، “تاریخ >> /var/log/date.log” را داریم. این دستوری است که می خواهیم در کانتینر اجرا کنیم. ساعت به طور پیش فرض هر دو ثانیه یک بار دستوری را که شما به آن می دهید اجرا می کند. دستوری که ساعت در این حالت اجرا می شود date >> /var/log/date.log است. date تاریخ و زمان فعلی را چاپ می کند، مانند:

Output
Fri Jul 23 14:57:05 UTC 2021

بخش >> /var/log/date.log دستور خروجی را از date تغییر مسیر داده و به فایل /var/log/date.log اضافه می کند. هر دو ثانیه یک خط جدید به فایل اضافه می شود و بعد از چند ثانیه چیزی شبیه به این خواهد شد:

Output
Fri Jul 23 15:00:26 UTC 2021
Fri Jul 23 15:00:28 UTC 2021
Fri Jul 23 15:00:30 UTC 2021
Fri Jul 23 15:00:32 UTC 2021
Fri Jul 23 15:00:34 UTC 2021

در مرحله بعد، نحوه یافتن نام کانتینرهای Docker را یاد خواهیم گرفت. اگر قبلاً کانتینری را دارید که هدف قرار داده اید اما مطمئن نیستید نام آن چیست، این کار مفید خواهد بود.

پیدا کردن نام کانتینر داکر

ما باید docker exec را با نام (یا شناسه کانتینر) کانتینری که می‌خواهیم با آن کار کنیم ارائه کنیم. ما می توانیم این اطلاعات را با استفاده از دستور docker ps پیدا کنیم:

docker ps

این دستور همه کانتینرهای Docker در حال اجرا بر روی سرور را فهرست می کند و برخی از اطلاعات سطح بالا را در مورد آنها ارائه می دهد:

Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
76aded7112d4 alpine "watch 'date >> /var…" 11 seconds ago Up 10 seconds container-name

در این مثال، شناسه و نام کانتینر برجسته شده است. شما می‌توانید از هر کدام برای گفتن اینکه از کدام کانتینر استفاده کنید به docker exec استفاده کنید.

اگر می خواهید نام کانتینر خود را تغییر دهید، از دستور تغییر نام docker استفاده کنید:

docker rename container-name new-name

در مرحله بعد، چندین مثال از استفاده از docker exec برای اجرای دستورات در یک ظرف داکر را اجرا خواهیم کرد.

اجرای یک پوسته تعاملی در یک داکر کانتینر

اگر نیاز به راه اندازی یک پوسته تعاملی در داخل یک داکر کانتینر دارید، شاید برای کاوش در سیستم فایل یا اشکال زدایی فرآیندهای در حال اجرا، از docker exec با پرچم -i و -t استفاده کنید.

پرچم -i ورودی را به ظرف باز نگه می‌دارد و پرچم -t یک شبه پایانه ایجاد می‌کند که پوسته می‌تواند به آن متصل شود. این پرچم ها را می توان به صورت زیر ترکیب کرد:

docker exec -it container-name sh

با این کار shell در ظرف مشخص شده اجرا می‌شود و به شما یک درخواست اولیه پوسته می‌دهد. برای خروج از کانتینر، exit را تایپ کرده و ENTER را فشار دهید:

exit

اگر تصویر ظرف شما شامل پوسته پیشرفته تری مانند bash است، می توانید sh را با bash در بالا جایگزین کنید.

اجرای یک فرمان غیر تعاملی در یک داکر کانتینر

اگر نیاز به اجرای دستوری در داخل یک کانتینر در حال اجرا دارید، اما نیازی به تعامل ندارید، از دستور docker exec بدون هیچ پرچمی استفاده کنید:

docker exec container-name tail /var/log/date.log

این دستور tail /var/log/date.log را روی ظرف نام کانتینر اجرا می کند و نتایج را به بیرون می دهد. به طور پیش فرض، دستور tail ده خط آخر یک فایل را چاپ می کند. اگر کانتینر آزمایشی را که در بخش اول تنظیم کرده‌ایم اجرا می‌کنید، چیزی شبیه به این خواهید دید:

Output
Mon Jul 26 14:39:33 UTC 2021
Mon Jul 26 14:39:35 UTC 2021
Mon Jul 26 14:39:37 UTC 2021
Mon Jul 26 14:39:39 UTC 2021
Mon Jul 26 14:39:41 UTC 2021
Mon Jul 26 14:39:43 UTC 2021
Mon Jul 26 14:39:45 UTC 2021
Mon Jul 26 14:39:47 UTC 2021
Mon Jul 26 14:39:49 UTC 2021
Mon Jul 26 14:39:51 UTC 2021

این در اصل مانند باز کردن یک پوسته تعاملی برای ظرف Docker است (همانطور که در مرحله قبل با docker exec -it container-name sh انجام شد) و سپس اجرای دستور tail /var/log/date.log. با این حال، به جای باز کردن یک پوسته، اجرای دستور، و سپس بستن پوسته، این دستور همان خروجی را در یک دستور واحد بدون باز کردن شبه پایانه برمی‌گرداند.

اجرای دستورات در یک فهرست جایگزین در یک داکر کانتینر

برای اجرای یک دستور در دایرکتوری خاصی از کانتینر خود، از پرچم –workdir برای مشخص کردن دایرکتوری استفاده کنید:

docker exec --workdir /tmp container-name pwd

این دستور مثال دایرکتوری tmp / را به عنوان دایرکتوری کاری تنظیم می کند، سپس دستور pwd را اجرا می کند که دایرکتوری کاری فعلی را چاپ می کند:

Output
/tmp

دستور pwd تأیید کرده است که دایرکتوری کار / tmp است.

اجرای دستورات به عنوان یک کاربر متفاوت در یک داکر کانتینر

برای اجرای یک فرمان به عنوان یک کاربر دیگر در داخل ظرف خود، پرچم –user را اضافه کنید:

docker exec --user guest container-name whoami

این از کاربر مهمان برای اجرای دستور whoami در کانتینر استفاده می کند. دستور whoami نام کاربری فعلی کاربر را چاپ می کند:

Output
guest

دستور whoami تایید می کند که کاربر فعلی کانتینر مهمان است.

انتقال متغیرهای محیطی به کانتینر داکر

گاهی اوقات لازم است متغیرهای محیطی را به همراه دستور اجرا به یک ظرف منتقل کنید. پرچم -e به شما امکان می دهد یک متغیر محیطی را مشخص کنید:

docker exec -e TEST=sammy container-name env

این دستور متغیر محیطی TEST را برابر با sammy قرار می دهد، سپس دستور env را در داخل کانتینر اجرا می کند. سپس دستور env تمام متغیرهای محیط را چاپ می کند:

Output
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=76aded7112d4
TEST=sammy
HOME=/root

متغیر TEST روی sammy تنظیم شده است.

برای تنظیم چندین متغیر، پرچم -e را برای هر یک تکرار کنید:

docker exec -e TEST=sammy -e ENVIRONMENT=prod container-name env

اگر می خواهید فایلی پر از متغیرهای محیطی را ارسال کنید، می توانید این کار را با پرچم –env-file انجام دهید.

ابتدا فایل را با یک ویرایشگر متن بسازید. ما در اینجا یک فایل جدید با nano باز می کنیم، اما شما می توانید از هر ویرایشگری که با آن راحت هستید استفاده کنید:

nano .env

ما از .env به عنوان نام فایل استفاده می کنیم، زیرا این استاندارد محبوبی برای استفاده از این نوع فایل ها برای مدیریت اطلاعات خارج از کنترل نسخه است.

متغیرهای KEY=value خود را در فایل، یکی در هر خط، مانند شکل زیر بنویسید:

TEST=sammy
ENVIRONMENT=prod

ذخیره کنید و فایل را ببندید. برای ذخیره فایل و خروج از nano، CTRL+O و سپس ENTER را برای ذخیره و سپس CTRL+X را برای خروج فشار دهید.

اکنون دستور docker exec را اجرا کنید و نام فایل صحیح را بعد از –env-file مشخص کنید:

docker exec --env-file .env container-name env
Output
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=76aded7112d4
TEST=sammy
ENVIRONMENT=prod
HOME=/root

دو متغیر در فایل تنظیم شده است.

شما می توانید چندین فایل را با استفاده از چندین پرچم –env-file مشخص کنید. اگر متغیرهای موجود در فایل‌ها با یکدیگر همپوشانی داشته باشند، هر کدام از فایل‌ها در آخرین دستور فهرست شده باشد، فایل‌های قبلی را لغو می‌کند.

خطاهای رایج

هنگام استفاده از دستور docker exec، ممکن است با چند خطای رایج روبرو شوید:

Error: No such container: container-name

خطای No such container به این معنی است که ظرف مشخص شده وجود ندارد و ممکن است نشان دهنده اشتباه املایی نام ظرف باشد. از docker ps برای فهرست کردن کانتینرهای در حال اجرا خود استفاده کنید و نام را دوباره بررسی کنید.

Error response from daemon: Container 2a94aae70ea5dc92a12e30b13d0613dd6ca5919174d73e62e29cb0f79db6e4ab is not running

این پیام در حال اجرا به این معنی است که ظرف وجود دارد اما متوقف شده است. می توانید کانتینر را با docker start container-name راه اندازی کنید

Error response from daemon: Container container-name is paused, unpause the container before exec

خطای Container is paused مشکل را به خوبی توضیح می دهد. قبل از ادامه، باید کانتینر را با docker unpause container-name لغو مکث کنید.

نتیجه

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

برای اطلاعات بیشتر در مورد Docker به طور کلی، لطفاً به صفحه تگ Docker ما مراجعه کنید، که دارای پیوندهایی به آموزش های Docker، صفحات پرسش و پاسخ مرتبط با Docker و موارد دیگر است.

[تعداد: 1   میانگین: 5/5]
دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

شاید دوست داشته باشید