برنامه نویسی

1minDocker #5 – یک تصویر Docker بسازید و فشار دهید

Summarize this content to 400 words in Persian Lang
در آخرین مقاله دیدیم که چگونه می‌توانیم یک تصویر را بکشیم، آن را در داخل یک ظرف اجرا کنیم، تصاویر و کانتینرها را فهرست کنیم و آنها را حذف کنیم: اکنون زمان ساخت است، بنابراین اولین تصویر Docker ساده خود را ایجاد می‌کنیم.

Dockerfile

همانطور که قبلاً در مقدمه مفهومی خود برای Docker گفتیم، Dockerfile نوعی دستور غذا است: حاوی تمام دستورالعمل های جمع آوری مواد تشکیل دهنده است ( تصویر) که کیک (the ظرف).

اما یک Dockerfile دقیقاً چه چیزی می تواند داشته باشد؟ ما در مثال خود (که در اینجا می توانید پیدا کنید) کلمات کلیدی پایه زیر را خواهیم دید:

FROM: این کلمه کلیدی اساسی است. تصویر پایه ای را مشخص می کند که از آن محیط خود را سوار می کنیم

RUN: با این کلید می توانید یک دستور (مانند RUN python3 -m pip install –no-cache-dir requirements.txt) که در طول اجرا خواهد شد زمان ساخت (فقط یک بار) و در یک لایه تصویر ذخیره می شود

WORKDIR: می توانید دایرکتوری کاری که پایه تصویر Docker شما خواهد بود را مشخص کنید (به عنوان مثال WORKDIR /app/)

COPY یا ADD: این دو کلمه کلیدی بسیار شبیه هم هستند. COPY به شما امکان می دهد پوشه های محلی خاص را در یک پوشه داخل تصویر کپی کنید (مانند COPY src/ /app/) در حالی که ADD کل مسیر مشخص شده محلی را به فهرست مقصد در داخل تصویر داکر اضافه می کند (ADD . /app/)

EXPOSE: درگاهی را مشخص می کند که در داخل کانتینر به سمت خارج قرار دارد (EXPOSE 3000)

ENTRYPOINT: این کلمه کلیدی فایل اجرایی پیش فرضی را مشخص می کند که باید هنگام راه اندازی تصویر در یک کانتینر اجرا شود (ENTRYPOINT [“npm”, “start”]). باید در انتهای فایل Docker شما و فقط یک بار مشخص شود (در غیر این صورت آخرین ENTRYPOINT نمونه موارد دیگر را لغو می کند). اگرچه ENTRYPOINT وقتی کانتینر را اجرا می‌کنیم، نمی‌توان اجرایی را با دستورات دیگری که از طریق CLI ارائه می‌شوند لغو کرد، آرگومان‌های آن را می‌توان با شروع کانتینر از CLI تغییر داد.

CMD: مشابه ENTRYPOINT، این کلمه کلیدی دستوری را مشخص می کند که هر بار که تصویر در داخل یک ظرف شروع می شود اجرا می شود. متفاوت از ENTRYPOINTبا این حال، می توان آن را به طور کامل نادیده گرفت و به طور کلی به عنوان مجموعه ای از آرگومان های اضافی برای استفاده می شود ENTRYPOINT، مانند اینجا:

ENTRYPOINT [ “streamlit”, “run” ] CMD [ “scripts/app.py” ]

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در این حالت، هر بار که کانتینر را راه‌اندازی می‌کنیم، یک برنامه Streamlit را اجرا می‌کنیم، اما می‌توانیم مسیر برنامه را با ارائه آن به کانتینر از مسیر انتخاب کنیم. docker run خط فرمان

ARG: این کلمه کلیدی برای تنظیم آرگومان های ساخت استفاده می شود، که متغیرهای محلی هستند که می توانند توسط سایر موارد مشخص شده در زمان ساخت با docker build CLI. اگر از یک مقدار بیش از یک بار در Dockerfile خود استفاده کنید و نمی خواهید آن را تکرار کنید، آنها بسیار مفید هستند:

ARG NODE_VERSION=”20″
ARG ALPINE_VERSION=”3.20″

FROM node:${NODE_VERSION}-alpine${ALPINE_VERSION}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این را می توان به راحتی با موارد زیر نادیده گرفت:

docker build . –build-args NODE_VERSION=”18″

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ENV: این کلمه کلیدی، همانطور که از نام آن پیداست، یک را تنظیم می کند محیط زیست متغیر متغیرهای محیطی ثابت هستند و در زمان ساخت قابل تغییر نیستند و زمانی می توانند مفید باشند که بخواهیم یک متغیر برای تمام مراحل ساخت تصویر قابل دسترسی باشد.

بیایید یک Dockerfile بسازیم

برای ساخت یک Dockerfile، باید بدانیم که چه برنامه‌ای را از طریق تصویری که می‌خواهیم تنظیم کنیم ارسال کنیم.

در این آموزش، ما یک برنامه پایتون بسیار ساده با Gradio می‌سازیم، یک فریمورک محبوب برای ساخت ظاهر زیبا و زیبا برای برنامه‌های پایتون AI/ML.

پوشه ما به شکل زیر خواهد بود:

build_an_image_1/
|__ app.py
|__ Dockerfile

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

برای پر کردن app.py، ما از قالبی استفاده خواهیم کرد که خود Hugging Face برای Gradio Chat Bot Spaces ارائه می کند:

import gradio as gr

def respond(
message,
history):
message_back = f”Your message is: {message}”
response = “”
for m in message_back:
response += m
yield response

demo = gr.ChatInterface(
respond,
title=”Echo Bot”,
)

if __name__ == “__main__”:
demo.launch(server_name=”0.0.0.0″, server_port=7860)

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این یک ربات ساده است که هر پیامی را که ارسال می کنیم بازتاب می دهد. ما فقط این کد را در اسکریپت اصلی خود کپی می کنیم، app.py.

اکنون ما آماده ساختن تصویر Docker خود هستیم و با اصلاح Dockerfile خود شروع می کنیم.

1. تصویر پایه

برای محیط خود ما به پایتون 3 نیاز داریم، بنابراین باید یک تصویر پایه مناسب برای آن پیدا کنیم.

خوشبختانه خود پایتون تصاویر پایتون مبتنی بر آلپاین (یک توزیع لینوکس) را در اختیار ما قرار می دهد، بنابراین ما فقط از آن استفاده خواهیم کرد. python:3.11.9.

فقط در این صورت باید مشخص کنیم:

ARG PYTHON_VERSION=”3.11.9″
FROM python:${PYTHON_VERSION}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در همان ابتدای Dockerfile ما.

همانطور که گفتیم، اگر نسخه پایتون متفاوتی می‌خواهیم، ​​فقط باید اجرا کنیم:

docker build . –build-args PYTHON_VERSION=”3.10.14″

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

2. وابستگی های مورد نیاز را دریافت کنید

برنامه ما به طور انحصاری بستگی دارد gradio، بنابراین ما می توانیم سریع انجام دهیم pip install برای آن!

ما همچنین نسخه (5.4.0) را به عنوان ARG و ENV تنظیم کردیم:

ARG GRADIO_V=”5.4.0″
ENV GRADIO_VERSION=${GRADIO_V}

RUN python3 -m pip cache purge
RUN python3 -m pip install gradio==${GRADIO_VERSION}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

شما نمی توانید تغییر دهید GRADIO_VERSION مستقیم، اما شما می توانید عبور کنید GRADIO_V به عنوان یک آرگومان ساخت و اصلاح نیز ENV ارزش!

docker build . –build-args GRADIO_V=”5.1.0″

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

3. برنامه را شروع کنید

ما باید برنامه را شروع کنیم، کاری که معمولاً انجام می دهیم python3 app.py.

اما ما app.py فایل به صورت محلی ذخیره شده است، برای تصویر Docker در دسترس نیست، بنابراین باید آن را در فهرست کاری داکر خود کپی کنیم:

WORKDIR /app/
COPY ./app.py /app/

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

از آنجایی که برنامه ما در http://0.0.0.0:7860 اجرا می شود، باید پورت 7860 را در معرض نمایش قرار دهیم:

EXPOSE 7860

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اکنون می توانیم برنامه خود را اجرا کنیم:

ENTRYPOINT [“python3”] CMD [“/app/app.py”]

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ما نمی توانیم فایل اجرایی پایه را تغییر دهیم (python3) اما ما قادر به نادیده گرفتن آن خواهیم بود CMD به عنوان مثال مشخص کردن مسیر دیگری در زمان اجرا (مثلاً اگر در حین اجرای کانتینر حجمی را نصب کنیم).

4. فول داکرفایل

Dockerfile کامل ما به این صورت خواهد بود:

ARG PYTHON_VERSION=”3.11.9″
FROM python:${PYTHON_VERSION}

WORKDIR /app/
COPY ./app.py /app/

ARG GRADIO_V=”5.4.0″
ENV GRADIO_VERSION=${GRADIO_V}

RUN python3 -m pip cache purge
RUN python3 -m pip install gradio==${GRADIO_VERSION}

EXPOSE 7860

ENTRYPOINT [“python3”] CMD [“/app/app.py”]

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اکنون فقط باید تصویر را بسازیم!

تصویر را بسازید و فشار دهید

وقتی تصویر را می سازیم، باید آن را مشخص کنیم زمینهیعنی دایرکتوری که Dockerfile ما در آن قرار دارد. برای شروع، ما نیز از آن استفاده خواهیم کرد -t پرچم، که مشخص می کند نام و برچسب زدن از تصویر ما:

docker build . -t YOUR-USERNAME/gradio-echo-bot:0.0.0 -t YOUR-USERNAME/gradio-echo-bot:latest

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

همانطور که می بینید، می توانید چندین تگ را مشخص کنید.

این بیلد، پس از راه اندازی، چند دقیقه طول می کشد تا کامل شود و سپس تصاویر خود را به صورت محلی خواهید داشت!

اگر می‌خواهید این تصاویر را برای همه در دسترس قرار دهید، باید به حساب Docker خود وارد شوید:

docker login -u YOUR-USERNAME –password-stdin

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

از شما خواسته می شود که رمز عبور را از کنسول خود وارد کنید.

رمز عبور Docker خود را قرار نمی دهید، بلکه یک نشانه دسترسی (برای راهنمایی در مورد نحوه دریافت آن، پیوند را دنبال کنید).

حالا بیایید تصویر خود را به رجیستری Docker Hub فشار دهیم:

docker push YOUR-USERNAME/gradio-echo-bot:0.0.0
docker push YOUR-USERNAME/gradio-echo-bot:latest

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این فشار معمولاً کمی طول می‌کشد، اما پس از آن تصویر ما در Docker Hub پخش می‌شود: ما اولین تصویر Docker خود را منتشر کردیم!🎉

ما برای این مقاله در اینجا توقف خواهیم کرد، اما در مقاله بعدی به مفاهیم ساخت پیشرفته تر خواهیم پرداخت.

در آخرین مقاله دیدیم که چگونه می‌توانیم یک تصویر را بکشیم، آن را در داخل یک ظرف اجرا کنیم، تصاویر و کانتینرها را فهرست کنیم و آنها را حذف کنیم: اکنون زمان ساخت است، بنابراین اولین تصویر Docker ساده خود را ایجاد می‌کنیم.

Dockerfile

همانطور که قبلاً در مقدمه مفهومی خود برای Docker گفتیم، Dockerfile نوعی دستور غذا است: حاوی تمام دستورالعمل های جمع آوری مواد تشکیل دهنده است ( تصویر) که کیک (the ظرف).

اما یک Dockerfile دقیقاً چه چیزی می تواند داشته باشد؟ ما در مثال خود (که در اینجا می توانید پیدا کنید) کلمات کلیدی پایه زیر را خواهیم دید:

  • FROM: این کلمه کلیدی اساسی است. تصویر پایه ای را مشخص می کند که از آن محیط خود را سوار می کنیم
  • RUN: با این کلید می توانید یک دستور (مانند RUN python3 -m pip install --no-cache-dir requirements.txt) که در طول اجرا خواهد شد زمان ساخت (فقط یک بار) و در یک لایه تصویر ذخیره می شود
  • WORKDIR: می توانید دایرکتوری کاری که پایه تصویر Docker شما خواهد بود را مشخص کنید (به عنوان مثال WORKDIR /app/)
  • COPY یا ADD: این دو کلمه کلیدی بسیار شبیه هم هستند. COPY به شما امکان می دهد پوشه های محلی خاص را در یک پوشه داخل تصویر کپی کنید (مانند COPY src/ /app/) در حالی که ADD کل مسیر مشخص شده محلی را به فهرست مقصد در داخل تصویر داکر اضافه می کند (ADD . /app/)
  • EXPOSE: درگاهی را مشخص می کند که در داخل کانتینر به سمت خارج قرار دارد (EXPOSE 3000)
  • ENTRYPOINT: این کلمه کلیدی فایل اجرایی پیش فرضی را مشخص می کند که باید هنگام راه اندازی تصویر در یک کانتینر اجرا شود (ENTRYPOINT ["npm", "start"]). باید در انتهای فایل Docker شما و فقط یک بار مشخص شود (در غیر این صورت آخرین ENTRYPOINT نمونه موارد دیگر را لغو می کند). اگرچه ENTRYPOINT وقتی کانتینر را اجرا می‌کنیم، نمی‌توان اجرایی را با دستورات دیگری که از طریق CLI ارائه می‌شوند لغو کرد، آرگومان‌های آن را می‌توان با شروع کانتینر از CLI تغییر داد.
  • CMD: مشابه ENTRYPOINT، این کلمه کلیدی دستوری را مشخص می کند که هر بار که تصویر در داخل یک ظرف شروع می شود اجرا می شود. متفاوت از ENTRYPOINTبا این حال، می توان آن را به طور کامل نادیده گرفت و به طور کلی به عنوان مجموعه ای از آرگومان های اضافی برای استفاده می شود ENTRYPOINT، مانند اینجا:
ENTRYPOINT [ "streamlit", "run" ]
CMD [ "scripts/app.py" ]
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در این حالت، هر بار که کانتینر را راه‌اندازی می‌کنیم، یک برنامه Streamlit را اجرا می‌کنیم، اما می‌توانیم مسیر برنامه را با ارائه آن به کانتینر از مسیر انتخاب کنیم. docker run خط فرمان

  • ARG: این کلمه کلیدی برای تنظیم آرگومان های ساخت استفاده می شود، که متغیرهای محلی هستند که می توانند توسط سایر موارد مشخص شده در زمان ساخت با docker build CLI. اگر از یک مقدار بیش از یک بار در Dockerfile خود استفاده کنید و نمی خواهید آن را تکرار کنید، آنها بسیار مفید هستند:
ARG NODE_VERSION="20"
ARG ALPINE_VERSION="3.20"

FROM node:${NODE_VERSION}-alpine${ALPINE_VERSION}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این را می توان به راحتی با موارد زیر نادیده گرفت:

docker build . --build-args NODE_VERSION="18" 
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • ENV: این کلمه کلیدی، همانطور که از نام آن پیداست، یک را تنظیم می کند محیط زیست متغیر متغیرهای محیطی ثابت هستند و در زمان ساخت قابل تغییر نیستند و زمانی می توانند مفید باشند که بخواهیم یک متغیر برای تمام مراحل ساخت تصویر قابل دسترسی باشد.

بیایید یک Dockerfile بسازیم

برای ساخت یک Dockerfile، باید بدانیم که چه برنامه‌ای را از طریق تصویری که می‌خواهیم تنظیم کنیم ارسال کنیم.

در این آموزش، ما یک برنامه پایتون بسیار ساده با Gradio می‌سازیم، یک فریمورک محبوب برای ساخت ظاهر زیبا و زیبا برای برنامه‌های پایتون AI/ML.

پوشه ما به شکل زیر خواهد بود:

build_an_image_1/
|__ app.py
|__ Dockerfile
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

برای پر کردن app.py، ما از قالبی استفاده خواهیم کرد که خود Hugging Face برای Gradio Chat Bot Spaces ارائه می کند:

import gradio as gr


def respond(
    message,
    history):
    message_back = f"Your message is: {message}"
    response = ""
    for m in message_back:
        response += m
        yield response

demo = gr.ChatInterface(
    respond,
    title="Echo Bot",
)

if __name__ == "__main__":
    demo.launch(server_name="0.0.0.0", server_port=7860)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این یک ربات ساده است که هر پیامی را که ارسال می کنیم بازتاب می دهد.
ما فقط این کد را در اسکریپت اصلی خود کپی می کنیم، app.py.

اکنون ما آماده ساختن تصویر Docker خود هستیم و با اصلاح Dockerfile خود شروع می کنیم.

1. تصویر پایه

برای محیط خود ما به پایتون 3 نیاز داریم، بنابراین باید یک تصویر پایه مناسب برای آن پیدا کنیم.

خوشبختانه خود پایتون تصاویر پایتون مبتنی بر آلپاین (یک توزیع لینوکس) را در اختیار ما قرار می دهد، بنابراین ما فقط از آن استفاده خواهیم کرد. python:3.11.9.

فقط در این صورت باید مشخص کنیم:

ARG PYTHON_VERSION="3.11.9"
FROM python:${PYTHON_VERSION}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در همان ابتدای Dockerfile ما.

همانطور که گفتیم، اگر نسخه پایتون متفاوتی می‌خواهیم، ​​فقط باید اجرا کنیم:

docker build . --build-args PYTHON_VERSION="3.10.14"
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

2. وابستگی های مورد نیاز را دریافت کنید

برنامه ما به طور انحصاری بستگی دارد gradio، بنابراین ما می توانیم سریع انجام دهیم pip install برای آن!

ما همچنین نسخه (5.4.0) را به عنوان ARG و ENV تنظیم کردیم:

ARG GRADIO_V="5.4.0"
ENV GRADIO_VERSION=${GRADIO_V}

RUN python3 -m pip cache purge
RUN python3 -m pip install gradio==${GRADIO_VERSION}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

شما نمی توانید تغییر دهید GRADIO_VERSION مستقیم، اما شما می توانید عبور کنید GRADIO_V به عنوان یک آرگومان ساخت و اصلاح نیز ENV ارزش!

docker build . --build-args GRADIO_V="5.1.0"
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

3. برنامه را شروع کنید

ما باید برنامه را شروع کنیم، کاری که معمولاً انجام می دهیم python3 app.py.

اما ما app.py فایل به صورت محلی ذخیره شده است، برای تصویر Docker در دسترس نیست، بنابراین باید آن را در فهرست کاری داکر خود کپی کنیم:

WORKDIR /app/
COPY ./app.py /app/
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

از آنجایی که برنامه ما در http://0.0.0.0:7860 اجرا می شود، باید پورت 7860 را در معرض نمایش قرار دهیم:

EXPOSE 7860
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اکنون می توانیم برنامه خود را اجرا کنیم:

ENTRYPOINT ["python3"]
CMD ["/app/app.py"]
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ما نمی توانیم فایل اجرایی پایه را تغییر دهیم (python3) اما ما قادر به نادیده گرفتن آن خواهیم بود CMD به عنوان مثال مشخص کردن مسیر دیگری در زمان اجرا (مثلاً اگر در حین اجرای کانتینر حجمی را نصب کنیم).

4. فول داکرفایل

Dockerfile کامل ما به این صورت خواهد بود:

ARG PYTHON_VERSION="3.11.9"
FROM python:${PYTHON_VERSION}

WORKDIR /app/
COPY ./app.py /app/

ARG GRADIO_V="5.4.0"
ENV GRADIO_VERSION=${GRADIO_V}

RUN python3 -m pip cache purge
RUN python3 -m pip install gradio==${GRADIO_VERSION}

EXPOSE 7860

ENTRYPOINT ["python3"]
CMD ["/app/app.py"]
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اکنون فقط باید تصویر را بسازیم!

تصویر را بسازید و فشار دهید

وقتی تصویر را می سازیم، باید آن را مشخص کنیم زمینهیعنی دایرکتوری که Dockerfile ما در آن قرار دارد. برای شروع، ما نیز از آن استفاده خواهیم کرد -t پرچم، که مشخص می کند نام و برچسب زدن از تصویر ما:

docker build . -t YOUR-USERNAME/gradio-echo-bot:0.0.0 -t YOUR-USERNAME/gradio-echo-bot:latest
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

همانطور که می بینید، می توانید چندین تگ را مشخص کنید.

این بیلد، پس از راه اندازی، چند دقیقه طول می کشد تا کامل شود و سپس تصاویر خود را به صورت محلی خواهید داشت!

اگر می‌خواهید این تصاویر را برای همه در دسترس قرار دهید، باید به حساب Docker خود وارد شوید:

docker login -u YOUR-USERNAME --password-stdin
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

از شما خواسته می شود که رمز عبور را از کنسول خود وارد کنید.

رمز عبور Docker خود را قرار نمی دهید، بلکه یک نشانه دسترسی (برای راهنمایی در مورد نحوه دریافت آن، پیوند را دنبال کنید).

حالا بیایید تصویر خود را به رجیستری Docker Hub فشار دهیم:

docker push YOUR-USERNAME/gradio-echo-bot:0.0.0
docker push YOUR-USERNAME/gradio-echo-bot:latest
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این فشار معمولاً کمی طول می‌کشد، اما پس از آن تصویر ما در Docker Hub پخش می‌شود: ما اولین تصویر Docker خود را منتشر کردیم!🎉

ما برای این مقاله در اینجا توقف خواهیم کرد، اما در مقاله بعدی به مفاهیم ساخت پیشرفته تر خواهیم پرداخت.

نوشته های مشابه

دیدگاهتان را بنویسید

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

دکمه بازگشت به بالا