آموزش استفاده از GitHub Packages بعنوان Docker Image Registry

سرویس GitHub Packages یک مخزن برای نگهداری پکیج ها و Image های داکر (Docker) است. در این پست می‌خواهیم نحوه استفاده از این سرویس به عنوان Image Registry برای Image های داکر را توضیح دهیم. این سرویس می‌تواند همانند Image Registry اصلی داکر یعنی Docker Hub مخزنی برای نگهداری Image های Docker به کاربران و سازمان (Organization) ها ارائه کند. نکته مثبتی که این سرویس می‌تواند برای کاربران ایرانی داشته باشد عدم تحریم کاربران ایرانی از طرف GitHub می‌باشد.آموزش استفاده از GitHub Packages بعنوان Docker Image Registryوزش استفاده از GitHuفرایند Authenticationبرای Pull یا Push کردن Image ها در GitHub Packages لازم است که از طریق کلاینت Docker لاگین کنید. لاگین با استفاده از Username گیتهاب و یک توکن (Personal access token) انجام میشود. برای دریافت Personal access token، در منوی کاربری سایت GitHub، مسیر زیر را دنبال کنید:Settings > Developer Settings > Personal access tokensدر صفحه باز شده بر روی دکمه Generate new token کلیک کنید و یک عنوان دلخواه وارد کنید، دسترسی های Read و Write را تیک بزنید و عمر توکن را مشخص کنید تا توکن را دریافت کنید.اکنون می‌توانید با دستور زیر لاگین کنید. پس از اجرای دستور می‌بایست Username گیتهاب خود و سپس توکن دریافت شده را به جای Password وارد کنید.docker login ghcr.ioساخت Image های Dockerایمیج های داکر معمولا از روی Dockerfile ها ساخته می‌شوند و یا اینکه از Image Registry های دیگر مانند Docker Hub دریافت (Pull) می‌شوند.برای ساخت یک ایمیج از یک Dockerfile می‌توانید دستور زیر اجرا کنید:docker build -t my-image-name <Dockerfile-path>همچنین برای Pull کردن یک ایمیج (مثلا NGINX) از Docker Hub می‌توانید دستور زیر اجرا کنید:docker pull nginx:1.21.1-alpineانتشار (Push) Image ها در Github Packagesبا دستور docker images می‌توانید لیست ایمیج های موجود در دسکتاپ یا سرور خود را مشاهده کنید. آنرا اجرا و از وجود ایمیج مورد نظر اطمینان حاصل کنید.root@example ~$ docker images nginx 1.21.1-alpine b9e2356ea1be 10 months ago 22.8MB ubuntu 18.04 39a8cfeef173 10 months ago 63.1MB mysql 8.0.25 5c62e459e087 11 months ago 556MBبرای مثال می‌خواهیم ایمیج nginx را از لیست ایمیج های موجود در سرور را به GitHub Packages آپلود (Push) می‌کنیم. برای این کار ابتدا با دستور زیر یک تگ جدید با پیشوند آدرس سرویس GitHub Packages برای ایمیج مورد نظر می‌سازیم.docker tag b9e2356ea1be ghcr.io/{username}/nginx:1.21.1-alpineدر دستور بالا «b9e2356ea1be» شناسه (ID) ایمیج NGINX است که از اجرای دستور docker images بدست آوردیم. عبارت ghcr.io/{username}/nginx:1.21.1-alpine آدرس جدید ایمیج است که باید با ghcr.io (آدرس سرویس GitHub Packages) شروع شود. {username} را باید با Username یا Organization گیتهاب خود تغییر دهید. nginx نام ایمیج و 1.21.1-alpine تگ آن است.در انتها با دستور زیر، Image در GitHub Packages اپلود (Push) می‌شود. docker push ghcr.io/{username}/nginx:1.21.1-alpineلیست Images های Push شده می‌توانید در یکی از آدرس های زیر (اولی برای اکانت شخصی و دومی برای Organization) مشاهده کنید.https://github.com/{username}?tab=packageshttps://github.com/orgs/{name}/packagesتنظیمات Image هادر پنل GitHub Packages روی Image مورد نظر کلیک کنید و از ستون سمت راست بر روی دکمه Package Settings کلیک کنید. در صفحه باز شده می‌توانید تنظیمات مربوط به Image را تغییر دهید.برای مثال، در بخش Manage access می‌توانید کاربرانی را که به Image دسترسی دارند را مدیریت کنید. در صورتی که می‌خواهید Image بصورت Public ارائه شود تا برای عموم قابل استفاده باشد، بر روی دکمه Change Visibility کلیک کنید و آنرا روی Public بگذارید.دریافت (Pull) ایمیج هاهمانند Docker Hub و دیگر Docker Image Registry ها، با دستوری مشابه دستور زیر می‌توانید یک Image را بر روی دسکتاپ یا سرور خود Pull کنید.docker pull ghcr.io/{username}/nginx:1.21.1-alpineسخن پایانیدر این پست، نحوه استفاده از GitHub Packages بعنوان یک Docker Image Registry برای Pull و Push کردن Image های Docker آموزش داده شد. این سرویس می‌تواند جایگزین مناسبی برای سرویس Docker Hub که کاربران ایرانی را تحریم کرده باشد.این سرویس می‌تواند نقش یک Registry رایگان را برای Image های عمومی و خصوصی پروژه های شما ایفا کند. همچنین اگر امکان نصب پروکسی بر روی سرور را ندارید می‌توانید Image های مورد نیاز از Docker Hub را روی کامپیوتر دسکتاپ (که پروکسی دارد) Pull و در Packages گیتهاب Push کنید و در پروژه های خود از آن استفاده کنید.