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 خود را منتشر کردیم!🎉
ما برای این مقاله در اینجا توقف خواهیم کرد، اما در مقاله بعدی به مفاهیم ساخت پیشرفته تر خواهیم پرداخت.