این یک پست مهمان از ویکتور پترسون ، مدیرعامل Screenly.io است. Screenly محبوب ترین محصول علامت گذاری دیجیتال برای Raspberry Pi است. ویکتور را در Twittervpetersson بیابید.
در پست قبلی وبلاگ ، ما در مورد چگونگی کامپایل Qt برای Screenly OSE با استفاده از ویژگی های چند مرحله ای و چند پلتفرم Docker صحبت کردیم. در این مقاله ، ما بیشتر بر روی این موضوع کار می کنیم و حافظه پنهان را بزرگنمایی می کنیم.
Docker با ذخیره کردن لایه ها کار خوبی انجام می دهد. هر دستور (به عنوان مثال ، RUN ، ADD و غیره) یک لایه ایجاد می کند ، سپس Docker در ساخت های بعدی مجدداً استفاده می کند مگر اینکه چیزی تغییر کند. مثل همیشه ، این روند استثنائاتی نیز دارد ، اما این به طور کلی صحت دارد. نوع دیگر حافظه پنهان حافظه پنهان برای یک عملیات خاص است ، مانند تهیه کد منبع ، در داخل یک ظرف.
در Screenly ، ما یک محیط ساخت Qt در داخل یک ظرف داکر ایجاد کردیم. ما این ساخت Qt را ایجاد کردیم تا اطمینان حاصل کنیم که روند ساخت مجدد قابل تکرار است و به راحتی می توان آن را بین توسعه دهندگان به اشتراک گذاشت. از آنجا که فرآیند کامپایل Qt مدت زمان زیادی طول می کشد ، ما ccache را برای سرعت بخشیدن به جمع آوری Qt استفاده کردیم. پیاده سازی حافظه پنهان نیاز به ولوم کردن یک پوشه از خارج از محیط Docker دارد.
اگر شما تنها توسعه دهنده ای هستید که روی این پروژه کار می کنید ، مراحل فوق به خوبی کار می کند. اگر بخواهید در سراسر تیم یک حافظه پنهان مشترک داشته باشید چه اتفاقی می افتد؟
برای انجام این سبک ذخیره سازی در Docker چند روش وجود دارد.
ساده ترین راه برای ایجاد حافظه پنهان مشترک با پیروی از آنچه در مقاله قبلی انجام دادیم. ما برای افزایش سرعت ذخیره سازی در BuildKit از حافظه پنهان دیسک به همراه برخی از ویژگی های شسته و رفته استفاده کردیم. سپس پرونده های حافظه پنهان را فشرده و به اعضای تیم توزیع کردیم. این روند بسیار ظریف نیست ، اما کار را به پایان می رساند.
اگر بخواهیم فرایند را کمی بیشتر خودکار کنیم ، می توانیم بازیابی حافظه پنهان را به عنوان بخشی از فرآیند ساخت لحاظ کنیم. نمونه ای از این ممکن است به این شکل باشد:
RUN curl -o /tmp/build-cache.tgz https://some-domain.com/build-cache.tgz &&
tar xfz /tmp/build-cache.tgz -C / tmp &&
rm /tmp/build-cache.tgzuesit1965901010] این فرایند بالا شسته و رفته است ، اما به این معنی است که کسی برای تازه نگه داشتن پرونده های حافظه پنهان نیاز به بارگذاری دوره ای حافظه پنهان دارد. علاوه بر این ، برای ذخیره سازی پرونده ها (مانند S3) به جایی نیاز دارید.
خوب است اگر بتوانیم از انجام کارهای دستی جلوگیری کنیم و از فناوری های بومی Docker برای انجام همان کار استفاده کنیم ، درست است؟ همانطور که مشخص شد ، ما می توانیم از Docker برای بهبود روند استفاده کنیم. ما فقط باید از تخیل خود استفاده کنیم.
همانطور که در مقاله قبلی نشان دادیم ، می توانیم از ساختارهای چند مرحله ای برای کپی کردن داده ها بین تصاویر مختلف docker استفاده کنیم. اگر حافظه پنهان را به یک تصویر اختصاصی Docker منتقل کنیم ، چه می کنیم؟ سپس می توانیم این تصویر را به Docker Hub فشار دهیم و آن را در مراحل ساخت بکشیم.
روند کار ساده ای است. با ایجاد دو تصویر متفاوت در Docker Hub شروع کنید. با آنها تماس بگیرید screenly / build-cache
و screenly / build-env
. با استفاده از مقاله قبلی ، ما از این Dockerfile به عنوان مبنای screenly / build-env
استفاده می کنیم.
در Dockerfile ، متغیر محیط CCACHE_DIR
را روی تنظیم کردیم src / ccache
. این مرحله به حافظه پنهان می گوید که حافظه نهان در / src / ccache
قرار دارد. در پست قبلی ، مرحله فقط نصب ولوم به سیستم بود. با این حال ، در این حالت ، ما می خواهیم این مرحله را تغییر دهیم تا حافظه پنهان خارج از / src
زندگی کند ، زیرا این مورد برای نصب پایه کد مانند / usr / ccache
استفاده می شود ].
اکنون می توانیم کانتینر را با استفاده از:
$ docker run --rm -t راه اندازی کنیم.
-v ~ / tmp / qt-src: / src
-v ~ / tmp / qt-build: / build
-v ~ / tmp / ccache: / usr / ccache
screenly-build-env
بعد از اینکه مجموعه خود را اجرا کردید ، اکنون می توانید تصویر حافظه پنهان ما را بسازید و فشار دهید. Dockerfile نهایی به این شکل خواهد بود:
از ابتدا
کپی حافظه پنهان / حافظه پنهان
برای ساختن این تصویر ، از کد زیر استفاده کنید:
$ cd ~ / tmp
$ docker build
-f / path / to / Dockerfile
-t screenly / build-cache
$ docker push screenly / build-cache را فشار دهید
سرانجام ، اکنون می توانید این لایه را در Dockerfile برای screenly / build-env
قرار دهید. خط را اضافه کنید:
COPY - از = screenly / build-cache / ccache / usr / ccache
دفعه دیگر که screenly / build-env
را دوباره بسازید ، Docker به طور خودکار حافظه پنهان را پایین می کشد. همچنین ، فقط هنگام تازه کردن حافظه پنهان ، باید میزان صدا را اضافه کنید.
درباره Screenly
Screenly محبوب ترین محصول علامت گذاری دیجیتال برای Raspberry Pi است. اگر می خواهید یک صفحه نمایش فیزیکی را به یک دستگاه ایمن و کنترل شده از راه دور (از طریق رابط کاربر یا API علامت دیجیتال) تبدیل کنید ، Screenly تنظیمات را نسبی می کند. کاربران می توانند داشبورد ، تصاویر ، فیلم ها و محتوای صفحه وب زیبا را به نمایش بگذارند.
Screenly در دو طعم در دسترس است: نسخه منبع باز و نسخه تجاری. می توانید نسخه تجاری ما را با یک دوره 14 روزه آزمایشی رایگان امتحان کنید.