آموزش استفاده از 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
آموزش استفاده از 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=packages

https://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 کنید و در پروژه های خود از آن استفاده کنید.