روش نوشتن یک Dockerfile

یکی از بهترین روشهای تولید یک تصویر داکر (docker image)، نوشتن یک Dockerfile و سپس استفاده از دستور docker build است. این روش به دلیل سادگی و سازگاری با متدولوژی زیرساخت، به صورت کد (Infrastructure as Code) به متداول ترین راه برای تولید تصاویر داکر تبدیل شده است.

جهت اجرای دستورات گفته شده در این مقاله نیاز دارید از قبل داکر را نصب کرده باشید. روش نصب داکر روی ویندوز یا لینوکس CentOS را می توانید در همین سایت مطالعه کنید. همچنین برای یادگیری بهتر این مطلب ممکن است آشنایی با مفاهیم پایه ای داکر به شما کمک کند.

ساده ترین Dockerfile میتواند تنها شامل یک خط باشد که مشخص میکند کدام تصویر قرار است به عنوان تصویر پایه، برای تولید یک تصویر جدید بکار گرفته شود. به عنوان مثال کافیست در یک پوشه فایلی با این محتویات و با نام Dockerfile ایجاد کنید:

 FROM debian:wheezy

سپس میتوانید با اجرای دستور docker build -t my-first-image $PWD ،در همان پوشه، اولین تصویر داکر خود را بسازید. در این حالت تصویر جدید کاملا مشابه تصویر پایه خواهد بود؛ که در این مثال نسخه Wheezy از سیستم عامل Debian است.

در نهایت با اجرای دستور docker images میتوانید تمامی تصاویر موجود روی ماشین داکر خودتان را لیست کنید که شامل تصویر جدید نیز می شود:

  $ docker images
    REPOSITORY         TAG       IMAGE ID       CREATED        SIZE
    debian             wheezy    2e9c7e5da19c   12 days ago    84.92 MB
    my-first-image     latest    2e9c7e5da19c   12 days ago    84.92 MB

همانطور که مشاهده میکنید شناسه های (ID) هر دو این تصاویر دقیقا یکسان هستند و حتی با اینکه تصویر جدید لحظاتی قبل تولید شده است، زمان ایجاد آن چند روز قبل و همزمان با تصویر پایه نشان داده میشود. این بدین دلیل است که دستور docker build‍ تشخیص میدهد که تصویر جدید هیچ تغییراتی نسبت به تصویر پایه ندارد و بنابراین نیازی به اختصاص فضا و شناسه جدید نیست. در واقع با این کار تنها یک نام جدید برای همان تصویر قبلی تولید شده است که این کار را میتوان با کمک دستور docker tag نیز به سادگی و بدون نیاز به Dockerfile انجام داد.

اضافه کردن فایل به تصویر

اگر فایلی مثلا به نام test.sh در همان پوشه داشته باشید میتوانید با اضافه کردن یک خط دیگر در Dockerfile این فایل را به مجموعه فایلهای موجود در تصویر خود اضافه کنید:

FROM debian:wheezy
COPY test.sh /test.sh

در این حالت خروجی دستور docker build به صورت زیر خواهد بود:

  $ docker build -t my-second-image .
    Sending build context to Docker daemon  2.56 kB
    Step 1 : FROM debian:wheezy
    ---> 2e9c7e5da19c
    Step 2 : COPY test.sh /test.sh
    ---> 0ff656c325b7
    Removing intermediate container 32821b2cd6d4
    Successfully built 0ff656c325b7

نکته قابل توجه در این خروجی وجود دو مرحله در ساخت این تصویر جدید است. حالا اگر لیست تصاویر موجود را مجددا بررسی کنید متوجه خواهید شد که تصویر جدید، به نام my-second-image، شناسه ای متفاوت از تصویر پایه دارد و در زمان جدیدتری نیز ساخته شده است:

 $ docker images
   REPOSITORY         TAG       IMAGE ID       CREATED        SIZE
   my-second-image    latest    0ff656c325b7   7 minutes ago  84.92 MB
   debian             wheezy    2e9c7e5da19c   12 days ago    84.92 MB
   my-first-image     latest    2e9c7e5da19c   12 days ago    84.92 MB

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

نکته: اگر در هیچ یک از فایل ها تغییری ایجاد نکرده باشید و دوباره اقدام به ساخت همین تصویر کنید متوجه خواهید شد که دفعه دوم فرآیند ساخت بسیار سریعتر و تقریبا به صورت آنی تمام میشود. علت این امر آن است که داکر برای هر مرحله یک تصویر میانی می سازد و تمامی این تصاویر میانی را به صورت موقت نگهداری میکند تا فرآیند ساخت را تسریع کند.

برای اینکه محتویات تصویر جدید را مشاهده کنید و از وجود فایلهای خود مطمئن شوید میتوانید اقدام به اجرای یک پوسته (shell) در یک کانتینر از این تصویر کنید:

   $ docker run --rm -ti my-second-image /bin/sh
   # ls -l /test.sh
   -rw-r--r-- 1 root root 0 May 16 13:32 /test.sh

در صورت نیاز برای آشنایی بیشتر با فرامین داکر میتوانید دستورات پرکاربرد داکر را مطالعه کنید.

همچنین لازم به ذکر است که دستور COPY مشابه قدیمی تری به نام ADD دارد که در حال حاضر کمتر استفاده می شود. این دو دستور تفاوتهایی با یکدیگر دارند، مانند اینکه در دستور ADD میتوان یک آدرس وب را بجای مبدا برای اضافه کردن یک فایل به تصویر استفاده کرد.