لینوکس ۳۰۵؛ شب ۴۳: ساخت image با Dockerfile و کاربر غیرroot
فهرست نوشته
image باید روش اجرای برنامه را قابل تکرار کند. امشب یک HTTP server کوچک میسازیم که با UID مشخص روی پورت داخلی 8080 کار میکند.
این جلسه بخشی از دورهٔ لینوکس ۳۰۵ در ۶۰ شب است.
جایگاه در دوره: هدفهای 352.3 آزمون 305-300.
محیط: docker-a، پوشهٔ تازهٔ ~/lpic305/app؛ فقط فایلهای زیر در build context باشند. برنامه آموزشی است و برای ارائهٔ عمومی طراحی نشده.
app.py:
from http.server import BaseHTTPRequestHandler, HTTPServer
class Handler(BaseHTTPRequestHandler):
def do_GET(self):
body = b"lpic305\n"
self.send_response(200)
self.send_header("Content-Type", "text/plain")
self.send_header("Content-Length", str(len(body)))
self.end_headers()
self.wfile.write(body)
HTTPServer(("0.0.0.0", 8080), Handler).serve_forever()
Dockerfile:
FROM python:3.13-alpine
ENV PYTHONDONTWRITEBYTECODE=1 PYTHONUNBUFFERED=1
WORKDIR /app
COPY --chown=10001:10001 app.py /app/app.py
USER 10001:10001
EXPOSE 8080
CMD ["python", "/app/app.py"]
.dockerignore:
.git
.env
*.pem
*.key
__pycache__
sudo docker build -t lab305-web:v1 .
sudo docker run --name web305 -d -p 127.0.0.1:18050:8080 lab305-web:v1
curl --fail http://127.0.0.1:18050/
sudo docker inspect web305 --format '{{.Config.User}}'
sudo docker logs web305
EXPOSE صرفاً metadata است؛ publish با -p انجام شد. پاسخ باید lpic305 باشد و UID برابر 10001؛ نمونهٔ خروجی ادعای اجرای این آزمایش روی ماشین نویسنده نیست.
build context و لایهها#
COPY فایل context را میگیرد؛ ADD قابلیتهای اضافه دارد و جایگزین بیدلیل COPY نیست. تغییر دستور زودتر در Dockerfile میتواند cache مراحل بعد را بیاعتبار کند. secret را با ARG/ENV یا COPY وارد layer نکن؛ حذف در layer بعد، نسخهٔ قبلی را پاک نمیکند.
در multi-stage، مرحلهٔ builder compiler/dependency دارد و مرحلهٔ نهایی تنها artifact لازم را با COPY –from میگیرد؛ برای این برنامهٔ بدون build، مرحلهٔ مصنوعی لازم نیست. در پروژهٔ دارای dependency ابتدا ساخت wheel/binary و سپس کپی artifact به runtime کوچک را طراحی کن؛ ABI و architecture باید سازگار باشند.
بازگشت: web305 را stop و rm کن؛ image v1 برای درسهای بعد میماند. برای نسخهٔ جدید tag جدید بساز و پس از بررسی digest پایه را ثابت کن.
منبع: Dockerfile reference ، multi-stage ، image رسمی Python .