Dockerfile شما، زیرساخت ما
اگر Dockerfile در ریشه باشد، بیلدپک کنار میرود و دقیقاً همان فایل ساخته میشود. چون محیط بیلد به مخازن عمومی اینترنت دسترسی ندارد، دستورهای npm، pip، go، composer، apt و apk بهصورت شفاف به میرور داخلی سکو کلود هدایت میشوند؛ اگر خودتان رجیستری تعریف کردهاید، دست نمیخورد.
اگر ایمیج را جای دیگری ساختهاید، بدون بیلد مستقرش کنید: sakoocloud deploy --image با نام کاربری و رمز رجیستری خصوصی. در هر دو حالت، EXPOSE و پورت اپ باید یکی باشند.
مناسب برای
- زبانها و نسخههایی که بیلدپک ندارد
- ایمیج آماده از CI خودتان
- سرویس با وابستگی سیستمی خاص
- مهاجرت از docker-compose
مسیر بیلد Docker
تشخیص
Dockerfileدر ریشه از همهی تشخیصها مقدم است.Dockerfileپیشپردازش
مدیرهای بسته به میرور داخلی هدایت میشوند، مگر نشانهی no-mirror در فایل باشد.
# sakoocloud:no-mirrorبیلد
BuildKit فایل را با کش لایهها میسازد.
docker buildاجرا
کانتینر اجرا و ترافیک به پورت اپ هدایت میشود.
EXPOSE 3000
خروجی یک استقرار واقعی
sakoocloud deploy ✔ Packed 2.3MB ✔ Source uploaded ℹ Build started · dep_7k2m9q #4 [1/5] FROM node:22-alpine #6 [2/5] RUN apk add --no-cache tini #8 [3/5] RUN npm ci #12 exporting to image ✔ Deployed — app is running. → https://my-service.sakooapps.ir
Dockerfile پیشنهادی
چندمرحلهای، با کاربر غیر root و پورتی که با اپ یکی است.
FROM node:22-alpine AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM node:22-alpine
WORKDIR /app
COPY --from=build /app/dist ./dist
COPY --from=build /app/node_modules ./node_modules
USER node
EXPOSE 3000
CMD ["node", "dist/index.js"]
sakoocloud apps create --name my-service --runtime docker --port 3000
sakoocloud deploy
تنظیمات
دو راه استقرار
| روش | دستور |
|---|---|
| بیلد از Dockerfile | sakoocloud deploy |
| ایمیج آماده | sakoocloud deploy --image <tag> |
| ایمیج خصوصی | --registry-user و --registry-pass |
میرور خودکار
فقط میزبانهای عمومی شناختهشده بازنویسی میشوند؛ مخزن اختصاصی شما دست نمیخورد.
| مدیر بسته | مخزن عمومی |
|---|---|
| npm | registry.npmjs.org |
| pip | pypi.org |
| apt | deb.debian.org |
| apk | dl-cdn.alpinelinux.org |
همراه هر استقرار
اینها به رانتایم بستگی ندارند و برای هر اپ روی سکو کلود فعالاند. بعضی، مثل مقیاسدهی خودکار و کرانجاب، به پلن بستگی دارند.
- دامنهی اختصاصی و SSLدامنه را اضافه کنید؛ گواهی خودکار صادر و تمدید میشود.
- متغیرهای محیطی و سکرتمقادیر رمزگذاریشده فقط در زمان اجرا به اپ میرسند.
- مرحلهی انتشارmigration بعد از بیلد و پیش از جایگزینی نسخهی قبلی اجرا میشود.
- لاگ زندهلاگ بیلد و زمان اجرا، در CLI و کنسول.
- بازگشت به نسخهی قبلهر استقرار قبلی با یک دستور برمیگردد.
- مقیاسدهیمنابع و تعداد نمونهها را تغییر دهید یا خودکارش کنید.
- دیسک ماندگاربرای فایلهایی که باید بعد از هر استقرار بمانند.
- کرانجابدستور زمانبندیشده با همان ایمیج و متغیرها.
- استقرار خودکار با گیتهر push روی شاخهی هدف بیلد و مستقر میشود.
خطاهای رایج
کانتینر بالا نمیآید
علتپورت EXPOSE و پورتی که برنامه رویش گوش میدهد با پورت اپ یکی نیست.
راهحلهر سه را یکی کنید و روی 0.0.0.0 گوش بدهید.
بستهی خصوصی در بیلد دانلود نمیشود
علتمحیط بیلد به سکرتها دسترسی ندارد.
راهحلبسته را داخل مخزن vendor کنید یا ایمیج را جای دیگری بسازید و با --image مستقر کنید.
دستور apt یا pip با میرور مشکل دارد
علتپیکربندی خودتان با بازنویسی خودکار تداخل دارد.
راهحلخط # sakoocloud:no-mirror را به Dockerfile اضافه کنید و دسترسی بستهها را خودتان تنظیم کنید.
پاد با OOMKilled متوقف میشود
علتمصرف حافظه از سقف منابع اپ بیشتر شده است.
راهحلحافظه را بیشتر کنید یا مصرف برنامه را پایین بیاورید.
sakoocloud apps scale --memory 1Gi
پرسشهای متداول
docker-compose پشتیبانی میشود؟
هر سرویس compose را یک اپ جدا کنید و دیتابیسها را از سرویسهای مدیریتشده بسازید؛ اتصال با لینک دیتابیس انجام میشود.
میتوانم از Docker Hub ایمیج بکشم؟
بله. ایمیجهای پایه از میرور images.sakoocloud.ir دریافت میشوند.
کانتینر با root اجرا شود؟
توصیه نمیشود. در Dockerfile با USER یک کاربر بدون دسترسی root تعریف کنید.
جزئیات بیشتر در راهنمای Docker در مستندات و مرجع CLI.