Docker build sırasında Mac'in uykuya geçmesini önleyin

Docker build sırasında Mac'in uykuya geçmesini önlemenin en hızlı yolu, build'i bir idle-sleep assertion'ıyla sarmalamaktır: Terminal'de caffeinate -i docker build -t myapp . ya da LidRun'ın kendi ücretsiz lidrun -- docker build -t myapp . komutu — lisans gerektirmeden aynı işi yapar. İkisi de Mac'in idle zamanlayıcısının, dakikalarca sürebilen yoğun CPU işi gerektiren bir build'i yarıda kesmesini engeller — ama hiçbiri bataryanızı izlemez, uzun bir derlemenin ürettiği ısıyı takip etmez veya kapak kapalıyken bir build'in kendi başına devam etmesini sağlamaz. İşte ücretsiz komut satırı çözümü, gerçek bir build'de nerede yetersiz kaldığı ve LidRun'ın bunun üzerine nasıl bir güvenlik katmanı eklediği.
Uyku modu neden bir Docker build'ini yarıda keser
Bir docker build arka planda çalışırken siz başka bir şeye geçersiniz — kod okursunuz, bir mesaja cevap verirsiniz, kapağı kapatıp başka bir odaya gidersiniz. Varsayılan idle zamanlayıcısının ya da kapalı kapağın uykuyu tetiklediği durum tam olarak budur.


Uyku modu bir build'i nazikçe duraklatıp sonra kaldığı yerden devam ettirmez. Süreci katmanın ortasında keser. Nerede durduğuna bağlı olarak, beklediğiniz katman önbelleğini kaybedersiniz ve istediğinizden çok daha geriden yeniden başlarsınız — bazen bağımlılık kurulumu katmanının tamamından, bazen sadece son RUN adımından.
Bunu gerçekten yaşayan build'ler; yavaş bir bağımlılık kurulumu veya büyük bir derleme adımı içeren çok aşamalı image'lar ve mimari-arası build'lerdir — docker buildx build --platform linux/amd64,linux/arm64 -t myapp . her hedefi Mac üzerinde emülasyon üzerinden çalıştırır ve native bir build'den birkaç kat daha uzun sürebilir. Varsayılan idle zamanlayıcısını aşan çalışmalar tam olarak bunlardır.
Ücretsiz, yerel çözüm: caffeinate ve pmset
Her Mac'te zaten hazır bulunan iki komut, en yaygın durumu kurulum gerektirmeden halleder. caffeinate -i docker build -t myapp ., build'i caffeinate'in alt süreci olarak çalıştırır, çalıştığı sürece bir 'idle uykusunu engelle' assertion'ı tutar ve docker build sonlanır sonlanmaz — başarılı ya da başarısız fark etmeksizin — bunu otomatik olarak serbest bırakır. Build zaten başka bir yerde çalışıyorsa, caffeinate -w <pid> yeni bir komut başlatmak yerine o process id'ye bağlanır.
LidRun, tam olarak aynı yöntemi ücretsiz bir CLI komutu olarak sunar: lidrun -- docker build -t myapp ., alt süreç etrafında aynı macOS assertion'ını (kIOPMAssertionTypePreventUserIdleSystemSleep — caffeinate'in -i bayrağının kullandığı assertion'ın aynısı) alır ve komut sonlandığında serbest bırakır. Lisans gerektirmez, arka planda çalışan bir uygulamaya da ihtiyaç duymaz; kendi başına yeterli bir wrapper'dır — caffeinate ile aynı fikir, üzerinde LidRun'ın adı yazılı.
Başından ayrılmak üzere olduğunuz bir terminal sekmesinde başlattığınız bir build için sudo pmset noidle, siz Ctrl-C ile durdurana kadar idle uykusunu sistem genelinde engeller — hedef bir komut yoktur, sadece sonlandırmaktan sizin sorumlu olduğunuz genel bir kilit vardır.
caffeinate ve pmset'in gerçek bir build'de yetersiz kaldığı yerler
Bu komutların hiçbiri sıcaklığı veya bataryayı izlemez. caffeinate -i ve lidrun -- ..., SoC serin serin boşta dursa da sıcak çalışsa da, batarya %80'de veya %3'te olsa da assertion'ı aynı güçte tutar — bir görüşleri yoktur, sadece sarmaladıkları komut sonlanana kadar tutarlar.
Bir idle-sleep assertion'ı, kapak-kapalı uykusunu geçersiz kılmaz. Harici bir ekran bağlı değilken build ortasında kapağı kapatırsanız, Mac caffeinate veya CLI wrapper'ın elinin altından yine de uykuya dalar — bunun için sudo pmset disablesleep 1 gerekir, ki bu sadece build'i değil Mac'in genel uyku davranışını etkiler. Sonrasında pmset disablesleep 0 çalıştırmayı unutursanız, siz bunu yapana kadar Mac kapak açık ya da kapalı fark etmeksizin bir daha kendiliğinden uykuya geçmez.
Bunların hiçbiri, siz unutursanız kendiliğinden temizlenmez. Bir saat önceki build'den kalma caffeinate veya pmset noidle'ı hâlâ çalıştıran boşta bir terminal sekmesi, korunacak hiçbir şey kalmadığı halde Mac'i uyanık — ve bataryadayken sıcak — tutmaya devam eder.
LidRun güvenlik katmanını nasıl ekliyor
Tam LidRun uygulaması aynı algılamayı, üzerinde bir governor gözetimiyle yapar. Auto Mode, varsayılan izleme listesinde zaten docker ve docker-compose'u barındırır, böylece bir build başladığı anda görünür hale gelir — hiçbir şey ayarlamanız gerekmez. Auto Mode ayrıca CPU'yu kontrol eder: eşleşen bir sürecin aktif sayılması için yaklaşık %20 CPU'yu (varsayılan eşik) aşması gerekir; kısa bir duraklamanın build ortasında tutmayı düşürmemesi için yaklaşık bir dakikalık bir bekleme süresi vardır.
Bu CPU kontrolü, bir build'in kendi derleyici ve paket yöneticisi süreçleri için genellikle sorun yaratmaz; ama Docker Desktop kurulumunuza bağlı olarak asıl yükü arka plandaki bir VM süreci taşırken docker istemcisinin kendisi çıktıyı akıtmaktan öteye geçmeyip idle'a daha yakın durabilir. Yerleşik "Docker → uyanık tut + dengeli soğutma" Smart Rule'unun amacı tam olarak budur: hiçbir CPU eşiği aramadan, sadece docker'ın varlığını görünce tetiklenir ve çalışan bir tane gördüğü anda Keep Awake'i ve dengeli bir soğutma profilini devreye sokar.
Algılamanın üzerine, LidRun'ın Safety Governor'ı aynı build'i izler. SoC kritik termal seviyeye ulaşırsa, her modda ve her güç kaynağında keep-awake tutmasını hemen serbest bırakır. Kritik durum sürüyorsa ve başından ayrılmışsanız — ya da kapak kapalıysa — fanları kaybedilmiş bir savaşta bırakmak yerine Mac'in gerçekten uykuya geçmesine izin vermeye yükselir. Kapak açıkken önünde oturan bir kullanıcı, yalnızca ısı nedeniyle asla zorla uyutulmaz; LidRun tutmayı serbest bırakır ki macOS karar versin — oturumu sizin elinizin altından kesip almaz.
Batarya da aynı kademeli muameleyi görür: varsayılan olarak LidRun %15 civarında uyarır, %5'te yükseltir ve %4'ün altına inemeyen bir tabanın ötesinde tutmaz — kontrollü bir durdurma, kontrolsüz olandan iyidir. Bu temel otomatik-durdurma herkes için ücretsizdir; Pro, her eşiği ayarlama imkânı ekler. Bu, LidRun'ın her yerde yaptığı aynı takas: agent — ya da build — çalışıyorsa uyanık kal; bitti veya güvensizse serbest bırak.
Bir Docker build'i için kurulum
Ücretsiz, lisanssız: Terminal'den lidrun -- docker build -t myapp ., caffeinate -i ile aynı korumayı, sadece LidRun'ın kendi binary'siyle sağlar. Bağımsız çalışır — tam uygulamanın açık olması gerekmez.
Uygulama açıkken, Auto Mode zaten varsayılan listesinde docker'ı barındırır, böylece Ayarlar'a dokunmadan bir build yakalanır. Varlık-tabanlı sürümü tercih ederseniz — istemci sürecinin kendisi serin çalıştığında işe yarar — menüden Smart Rules'u açın ve yerleşik "Docker → uyanık tut + dengeli soğutma" kuralını etkinleştirin. Auto Mode ve Smart Rules, Pro özellikleridir; Keep Awake, Timer ve Charging-only run her durumda ücretsiz ve sınırsız kalır.
Kapak kapalıyken de devam etmesini istediğiniz bir build için, yukarıdakilerden birini sert, havalandırmalı bir yüzeyde ve prize takılıyken Closed-Lid mode (yine Pro) ile eşleştirin. Closed-Lid mode, uygulama içinde pmset disablesleep'i çağırmasına izin verilen tek özelliktir ve her zaman 'açık'ı eşleşen bir 'kapalı' ile eşler — durdurmada, çıkışta ve bir sonraki açılışta — böylece bunu geri almayı sizin hatırlamanız gerekmez.
Bir betikten tek seferlik çok platformlu bir build için genellikle en basit yol CLI wrapper'dır: lidrun -- docker buildx build --platform linux/amd64,linux/arm64 -t myapp ., mimari-arası build ne kadar sürerse Mac'i tam o kadar uyanık tutar ve bittiği anda bırakır.
Buna gerçekten ne zaman ihtiyacınız var
Bu, uzun sürenler içindir — sıfırdan bir image, yerelde CI tarzı tam bir yeniden build, emülasyon üzerinden çok platformlu bir buildx çalışması, üzerinde gerçekten zaman harcayarak iterasyon yaptığınız bir base image. Bunlar idle zamanlayıcısını aşan ve korumaya değer build'lerdir.
Sıcak önbellekle yapılan hızlı bir yeniden build saniyeler içinde biter ve uyku zamanlayıcısına hiç yaklaşmaz — günlük iterasyon için bunların hiçbirine ihtiyaç yoktur.
Uzun bir build kapak kapatma veya idle zaman aşımı yüzünden birden fazla kez öldüyse, bu bir işarettir: tek seferlik bir çalıştırma için ücretsiz CLI wrapper'a başvurun, ya da bunu düşünmeden halledilmiş istiyorsanız Auto Mode ve arka planda çalışan termal izlemeyle tam uygulamayı kullanın.
Ağır build'ler için ipuçları
Büyük build'ler için fişe takın. Sürekli CPU kullanımı — ya da buildx ile aynı anda iki mimari üzerinde emüle edilmiş CPU — bir dizüstü bilgisayarı hızla tüketir; prize takılı olmak safety governor'ın dikkatini şarj yerine ısı üzerinde tutar.
Mac'i özellikle kapak kapalıyken sert, havalandırmalı bir yüzeyde tutun. Uzun bir derlemenin ürettiği ısının bir yere gitmesi gerekir; bir çanta ya da yumuşak bir yüzey, ısıyı taşıyacak havalandırma deliklerini tıkar.
Eşdeğer native build genellikle hızlı bittiğinde bile çok platformlu buildx build'lerini 'uzun build' durumu gibi ele alın — emülasyon üzerinden çapraz derleme daha sıcak çalışır ve hedef mimari başına belirgin şekilde daha uzun sürer.
Bir build takılabiliyor veya döngüye girebiliyorsa — sürekli yeniden denenen kararsız bir RUN adımı, --build olmadan bırakılmış bir docker compose up — Mac'i yanlışlıkla süresiz uyanık tutmasına izin vermeyin. CLI wrapper her durumda komut sonlanır sonlanmaz serbest bırakır, ve bir Smart Rule'un cooldown'u, çöküp döngüye giren bir container'da LidRun'ın durmadan yeniden tetiklenmesini önler.
LidRun, işinizi kapak kapalıyken, pil ve sıcaklık koruması yerleşik biçimde çalışır tutar.
LidRun zaten sizde mi? Kurulum rehberini okuyun →
LidRun'u yeni mi tanıdınız? Fiyatlara bakın →
Sık sorulanlar
Evet, batarya ve termal durum aktif eşiklerin içinde kaldığı sürece — varsayılan olarak %15 civarında uyarı, %5'te yükseltme ve %4'ün altına inemeyen bir force-sleep tabanı. Bir sınıra ulaşılırsa veya SoC kritik termal seviyeye çıkarsa, LidRun zorlamak yerine tutmayı serbest bırakır (ve başından ayrılmışsanız ya da kapak kapalıysa Mac'in gerçekten uykuya geçmesine izin verir).
Mekanik olarak, tek bir komut için pek fark yoktur — LidRun'ın kendi lidrun -- docker build ... CLI'ı, caffeinate'in -i bayrağının kullandığı idle-sleep assertion'ının aynısını tutar ve ücretsizdir. Fark, tam uygulama çalışırken ortaya çıkar: Auto Mode ve yerleşik Docker Smart Rule, siz bir wrapper komutu yazmadan build'i yakalar, ve Safety Governor, sade caffeinate'te olmayan termal ve batarya farkındalığını ekler — caffeinate, Mac ne kadar ısınırsa ısınsın assertion'ını aynı güçte tutar.
Sade lidrun -- docker build ... CLI wrapper'ı ücretsizdir ve lisans gerektirmez — caffeinate ile aynı fikir. Uygulama içindeki otomatik algılama (Auto Mode'un varsayılan izleme listesi ve yerleşik Docker Smart Rule) LidRun Pro'nun bir parçasıdır. Keep Awake, Timer ve Charging-only run her durumda ücretsiz ve sınırsız kalır.
Closed-Lid mode açıkken (Pro), evet — koşullar batarya ve termal sınırlarınızın içinde kaldığı sürece; sert, havalandırmalı bir yüzey ve prize takılı olmak kesinlikle önerilir. Closed-Lid mode olmadan, kapağı kapatmak caffeinate, lidrun -- veya Auto Mode'un ne tuttuğuna bakılmaksızın Mac'i uykuya sokar, çünkü bunların hiçbiri tek başına kapak-kapalı uykusunu geçersiz kılmaz.
Bir güvenlik eşiği oturumu sonlandırırsa — ya da Closed-Lid mode açık değilken kapak kapanırsa — build, herhangi bir kesintiye uğramış build gibi durur ve üzerinde olduğunuz katmanı kaybedebilirsiniz. Onu prize takılı, serin ve seçtiğiniz keep-awake seçeneğinin sınırları içinde tutmak, tamamlanana kadar çalışmasını ve önbelleği korumasını sağlayan şeydir.
Build aktif olarak onaylandığı sürece hayır. LidRun'ın unattended-idle koruması, tutmayı yalnızca gerçekten hiçbir şeyin çalışmadığını doğruladığında serbest bırakır — gerçekten aktif bir docker süreci, ya da Smart Rule tarafından eşleşen bir tanesi, klavyeden ne kadar süredir uzakta olduğunuza bakılmaksızın tutmayı sürdürür. Aktif bir build'i erken sonlandırabilecek şey, tek başına idle süresi değil, termal ve batarya sınırlarıdır.
Mekanik olarak hayır — bir docker buildx build --platform ... süreci, Auto Mode ve Smart Rule için hâlâ sadece docker'dır. Fark pratiktir: emülasyon üzerinden mimari-arası build'ler, native bir build'den daha uzun ve daha sıcak çalışır, bu yüzden bunları çıplak çalıştırmak yerine Closed-Lid mode, prize takılı olmak ve havalandırmalı bir yüzeyle eşleştirmek en değerli olan durumdur.