Ngăn Mac ngủ trong lúc build Docker

Henry AGI
6 phút đọcJun 2026
Ngăn Mac ngủ trong lúc build Docker

Cách nhanh nhất để ngăn Mac ngủ khi đang build Docker là bọc lệnh build trong một "idle-sleep assertion": chạy caffeinate -i docker build -t myapp . trong Terminal, hoặc dùng lệnh miễn phí riêng của LidRun là lidrun -- docker build -t myapp ., làm đúng việc tương tự mà không cần license. Cả hai đều chặn bộ đếm idle của Mac cắt ngang một build có thể chạy liên tục nhiều phút với CPU luôn bận — nhưng không cái nào theo dõi pin, theo dõi nhiệt sinh ra từ một lần compile dài, hay tự giữ cho build chạy tiếp khi gập nắp máy. Dưới đây là cách sửa miễn phí bằng dòng lệnh, những chỗ nó chưa đủ trên một build thực tế, và cách LidRun thêm một lớp an toàn lên trên.

Vì sao ngủ máy làm gãy một build Docker

Một lệnh docker build chạy nền trong lúc bạn chuyển sang việc khác — đọc code, trả lời tin nhắn, hay gập nắp máy để đi sang phòng khác. Đó chính xác là tình huống mà bộ đếm idle mặc định hoặc việc gập nắp sẽ kích hoạt chế độ ngủ.

LidRun
Diagram showing a Docker build's layers, with Mac sleep interrupting mid-layer and the rebuild restarting from an earlier cache point
Sleep không tạm dừng một Docker build — nó cắt ngang luôn, và bạn phải build lại từ chỗ cache dừng lại.

Chế độ ngủ không lịch sự tạm dừng build rồi chạy tiếp từ chỗ cũ. Nó cắt ngang tiến trình giữa chừng một layer. Tùy vào chỗ nó dừng lại, bạn mất luôn phần cache của layer đang chờ và phải build lại từ một điểm xa hơn mong muốn — có khi là cả layer cài dependency, có khi chỉ là bước RUN cuối cùng.

Những build thực sự gặp phải chuyện này là các image multi-stage có bước cài dependency chậm hoặc một bước compile lớn, và các build đa kiến trúc — docker buildx build --platform linux/amd64,linux/arm64 -t myapp . chạy từng target qua giả lập trên Mac và có thể mất lâu gấp nhiều lần so với build gốc. Đây chính là những lần chạy vượt quá thời gian của bộ đếm idle mặc định.

Cách sửa miễn phí, có sẵn trên máy: caffeinate và pmset

Hai lệnh đã có sẵn trên mọi Mac xử lý được trường hợp phổ biến này, không cần cài thêm gì. caffeinate -i docker build -t myapp . chạy build như một tiến trình con của caffeinate, giữ một assertion 'prevent idle sleep' trong suốt thời gian nó chạy, và tự động giải phóng ngay khi docker build kết thúc — dù thành công hay thất bại. Nếu build đã đang chạy ở nơi khác, caffeinate -w <pid> sẽ gắn vào process id đó thay vì khởi chạy một lệnh mới.

LidRun đóng gói đúng cùng một chiêu này thành lệnh CLI miễn phí: lidrun -- docker build -t myapp . giữ đúng cùng một assertion của macOS (kIOPMAssertionTypePreventUserIdleSystemSleep — chính là assertion mà cờ -i của caffeinate dùng) quanh tiến trình con và giải phóng khi lệnh kết thúc. Nó không cần license, cũng không cần app chạy nền; đây là một wrapper tự thân, cùng một ý tưởng như caffeinate nhưng mang tên LidRun.

Với một build được khởi chạy trong một tab terminal mà bạn sắp rời đi, sudo pmset noidle sẽ chặn idle sleep trên toàn hệ thống cho đến khi bạn nhấn Ctrl-C — không nhắm vào lệnh cụ thể nào, chỉ là một cú giữ toàn diện mà bạn phải tự chịu trách nhiệm kết thúc.

Hướng dẫn liên quanKhi MacBook của bạn nóng lên lúc lập trình

Chỗ caffeinate và pmset chưa đủ trên một build thực tế

Không lệnh nào trong hai lệnh trên theo dõi nhiệt độ hay pin. caffeinate -ilidrun -- ... giữ assertion ở cùng một mức bất kể SoC đang mát hay đang chạy nóng, và bất kể pin đang ở 80% hay 3% — chúng không có 'ý kiến' gì cả, chỉ giữ cho đến khi lệnh được bọc kết thúc.

Một idle-sleep assertion không ghi đè được chế độ ngủ khi gập nắp. Gập nắp máy giữa lúc build mà không cắm màn hình ngoài, Mac vẫn ngủ bất chấp caffeinate hay CLI wrapper đang giữ — muốn chặn được việc này cần sudo pmset disablesleep 1, và lệnh này ảnh hưởng đến hành vi ngủ của cả máy, không chỉ riêng build. Nếu quên chạy pmset disablesleep 0 sau đó, Mac sẽ không tự ngủ được nữa, dù mở hay gập nắp, cho đến khi bạn chạy lại lệnh.

Không cái nào trong số này tự dọn dẹp nếu bạn quên mất chúng. Một tab terminal thừa vẫn đang chạy caffeinate hay pmset noidle từ một build đã chạy cách đây cả tiếng vẫn giữ Mac thức — và nếu chạy pin, giữ máy ấm — rất lâu sau khi chẳng còn gì cần bảo vệ nữa.

LidRun thêm lớp an toàn như thế nào

Ứng dụng LidRun đầy đủ làm cùng việc phát hiện đó nhưng có một 'governor' theo dõi phía trên. Auto Mode đã có sẵn dockerdocker-compose trong danh sách theo dõi mặc định, nên một build sẽ được nhận diện ngay khi bắt đầu chạy — không cần cấu hình gì thêm. Auto Mode cũng kiểm tra CPU: một tiến trình khớp cần vượt qua khoảng 20% CPU (ngưỡng mặc định) mới được tính là đang hoạt động, kèm khoảng một phút trễ để một đợt lắng ngắn không làm rớt việc giữ máy giữa chừng build.

Việc kiểm tra CPU này thường không phải vấn đề với các tiến trình compiler hay package-manager của chính build, nhưng tùy vào cách bạn thiết lập Docker Desktop, phần việc nặng có thể diễn ra bên trong một tiến trình VM chạy nền trong khi client docker gần như đứng yên chỉ để stream output. Đó là lý do có sẵn Smart Rule 'Docker → keep awake + balanced cooling': nó kích hoạt chỉ cần docker đang hiện diện, không có ngưỡng CPU tối thiểu, và bật Keep Awake cùng một profile làm mát cân bằng ngay khi thấy nó đang chạy.

Bên trên phần phát hiện, Safety Governor của LidRun theo dõi ngay chính build đó. Nếu SoC chạm mức nhiệt nguy cấp, nó giải phóng ngay lập tức việc giữ máy thức, ở mọi mode và mọi nguồn điện. Nếu nhiệt vẫn ở mức nguy cấp và bạn đã rời khỏi máy — hoặc nắp máy đang gập — nó sẽ leo thang lên mức để Mac thực sự đi ngủ, thay vì để quạt tiếp tục chiến đấu một cách vô vọng. Một người dùng đang có mặt với nắp máy mở sẽ không bao giờ bị ép ngủ chỉ vì nhiệt độ; LidRun giải phóng việc giữ máy để macOS tự quyết định, chứ không cắt ngang phiên làm việc của bạn.

Pin cũng được xử lý theo từng nấc tương tự: mặc định LidRun cảnh báo ở khoảng 15%, leo thang ở 5%, và không giữ máy thức quá một ngưỡng sàn không thể thấp hơn 4% — một lần dừng có kiểm soát vẫn tốt hơn một lần dừng ngoài ý muốn. Mức auto-stop cơ bản này miễn phí cho tất cả mọi người; Pro cho phép tùy chỉnh từng ngưỡng. Đây là cùng một nguyên tắc đánh đổi mà LidRun áp dụng ở mọi nơi khác: agent — hay build — còn đang chạy thì giữ máy thức; xong việc hoặc không còn an toàn thì giải phóng.

Thiết lập cho một build Docker

Miễn phí, không cần license: chạy lidrun -- docker build -t myapp . từ Terminal cho cùng mức bảo vệ như caffeinate -i, chỉ khác là dùng binary riêng của LidRun. Nó chạy độc lập — không cần mở app đầy đủ.

Khi app đang mở, Auto Mode đã có sẵn docker trong danh sách mặc định, nên một build sẽ được nhận diện mà không cần đụng vào Settings. Nếu bạn muốn dùng phiên bản dựa trên sự hiện diện — hữu ích khi bản thân tiến trình client chạy khá mát — hãy mở Smart Rules từ menu và bật rule có sẵn 'Docker → keep awake + balanced cooling'. Auto Mode và Smart Rules là các tính năng Pro; Keep Awake, Timer, và Charging-only run vẫn miễn phí và không giới hạn dù thế nào.

Nếu muốn build sống sót qua việc gập nắp, kết hợp một trong hai cách trên với Closed-Lid mode (cũng là tính năng Pro), đặt máy trên một mặt phẳng cứng, thoáng khí và cắm sạc. Closed-Lid mode là thứ duy nhất trong app được phép gọi pmset disablesleep, và nó luôn ghép lệnh 'bật' với một lệnh 'tắt' tương ứng — khi dừng, khi thoát app, và ở lần khởi chạy kế tiếp — nên bạn không phải tự nhớ để hoàn tác nó.

Với một build đa nền tảng chạy một lần từ script, CLI wrapper thường là cách đơn giản nhất: lidrun -- docker buildx build --platform linux/amd64,linux/arm64 -t myapp . giữ Mac thức đúng bằng khoảng thời gian build đa kiến trúc cần và buông ngay khi xong.

Khi nào bạn thực sự cần đến việc này

Điều này dành cho những build dài — một image build từ đầu, một lần rebuild toàn bộ kiểu CI ngay trên máy, một lần chạy buildx đa nền tảng qua giả lập, hay một base image bạn đang chỉnh sửa lặp đi lặp lại mà tốn thời gian thật sự. Đó là những build vượt quá thời gian của bộ đếm idle và đáng để bảo vệ.

Một lần rebuild nhanh với cache còn 'ấm' xong trong vài giây và chẳng bao giờ chạm gần đến bộ đếm ngủ — không cần đến bất kỳ điều nào ở trên cho việc lặp lại hàng ngày.

Nếu một build dài đã 'chết' vì gập nắp hoặc idle timeout nhiều hơn một lần, đó chính là tín hiệu: dùng CLI wrapper miễn phí cho một lần chạy đơn lẻ, hoặc dùng app đầy đủ với Auto Mode và việc theo dõi nhiệt chạy nền nếu bạn muốn mọi thứ được xử lý mà không phải nghĩ tới nữa.

Mẹo cho các build nặng

Cắm sạc khi chạy các build lớn. CPU chạy liên tục — hoặc với buildx, CPU giả lập trên hai kiến trúc cùng lúc — làm laptop hết pin nhanh, và nguồn điện lưới giúp safety governor tập trung vào nhiệt độ thay vì lo lắng về mức pin.

Đặt Mac trên một mặt phẳng cứng, thoáng khí, đặc biệt khi gập nắp. Nhiệt sinh ra từ một lần compile dài phải thoát đi đâu đó, và một chiếc túi hay bề mặt mềm sẽ chặn khe thoát nhiệt vốn giúp dẫn nhiệt ra ngoài.

Hãy coi các build buildx đa nền tảng như trường hợp 'build dài' ngay cả khi build gốc tương ứng thường xong nhanh — cross-compile qua giả lập chạy nóng hơn và tốn thời gian rõ rệt hơn cho mỗi kiến trúc target.

Nếu một build có thể bị treo hoặc lặp vô hạn — một bước RUN chập chờn bị retry mãi không dừng, một lệnh docker compose up để quên không có --build — đừng để nó vô tình giữ Mac thức mãi mãi. CLI wrapper vẫn sẽ giải phóng ngay khi lệnh kết thúc dù thế nào, và cooldown của Smart Rule giúp LidRun không bị kích hoạt liên tục trên một container cứ crash rồi loop lại.

Thử nó thay vì vật lộn với ngủ khi gập máy

LidRun giữ công việc của bạn chạy tiếp khi đóng nắp, với cơ chế bảo vệ pin và nhiệt tích hợp sẵn.

Tải cho macOS

Đã có LidRun? Đọc hướng dẫn thiết lập →

Mới biết đến LidRun? Xem bảng giá →

Câu hỏi thường gặp

LidRun có giữ Mac thức suốt cả quá trình build Docker không?

Có, miễn là pin và nhiệt độ vẫn nằm trong các ngưỡng đang áp dụng — mặc định là cảnh báo ở khoảng 15%, leo thang ở 5%, và một ngưỡng sàn force-sleep không thể thấp hơn 4%. Nếu chạm một trong các giới hạn đó, hoặc SoC chạm mức nhiệt nguy cấp, LidRun sẽ giải phóng việc giữ máy (và nếu bạn đã rời đi hoặc nắp máy đang gập, để Mac thực sự đi ngủ) thay vì cố giữ bằng mọi giá.

LidRun khác gì so với việc chỉ chạy caffeinate -i docker build ...?

Về mặt cơ chế, với một lệnh đơn lẻ thì không khác nhau nhiều — CLI lidrun -- docker build ... của LidRun giữ đúng cùng một idle-sleep assertion mà cờ -i của caffeinate dùng, và cũng miễn phí. Sự khác biệt xuất hiện khi app đầy đủ đang chạy: Auto Mode và Smart Rule Docker có sẵn sẽ nhận diện build mà bạn không cần gõ lệnh wrapper, và Safety Governor thêm khả năng nhận biết nhiệt độ và pin mà caffeinate thuần túy không có — caffeinate giữ assertion ở cùng một mức bất kể Mac nóng đến đâu.

Việc phát hiện Docker có miễn phí không, hay cần Pro?

CLI wrapper lidrun -- docker build ... thuần túy thì miễn phí và không cần license — cùng ý tưởng như caffeinate. Việc tự động phát hiện bên trong app (danh sách theo dõi mặc định của Auto Mode, và Smart Rule Docker có sẵn) thuộc về LidRun Pro. Keep Awake, Timer, và Charging-only run vẫn miễn phí và không giới hạn dù thế nào.

Tôi có thể gập nắp máy trong lúc build Docker không?

Nếu bật Closed-Lid mode (Pro) thì được, miễn là điều kiện pin và nhiệt độ vẫn nằm trong giới hạn — rất nên đặt máy trên mặt phẳng cứng, thoáng khí và cắm sạc. Nếu không bật Closed-Lid mode, gập nắp sẽ khiến Mac đi ngủ bất kể caffeinate, lidrun --, hay Auto Mode đang giữ gì, vì không cái nào trong số đó tự ghi đè được chế độ ngủ khi gập nắp.

Tôi có mất layer cache nếu Mac vẫn đi ngủ không?

Nếu một ngưỡng an toàn kết thúc phiên làm việc — hoặc nắp máy bị gập khi chưa bật Closed-Lid mode — build sẽ dừng lại như bất kỳ build nào bị gián đoạn, và bạn có thể mất layer đang chạy dở. Giữ máy cắm sạc, mát, và trong phạm vi tùy chọn giữ máy thức mà bạn đã chọn là điều giúp build chạy trọn vẹn đến khi xong và giữ được cache.

Nếu tôi rời khỏi máy trong lúc build dài, LidRun có tự giải phóng việc giữ máy không?

Không, miễn là build được xác nhận đang hoạt động. Cơ chế bảo vệ 'unattended-idle' của LidRun chỉ giải phóng việc giữ máy khi đã xác nhận không còn gì thực sự đang chạy — một tiến trình docker thật sự đang hoạt động, hoặc một tiến trình được Smart Rule nhận diện, vẫn giữ máy thức bất kể bạn đã rời bàn phím bao lâu. Chính giới hạn về nhiệt độ và pin, chứ không phải riêng thời gian rời máy, mới là thứ có thể kết thúc sớm một build đang hoạt động.

Các build buildx đa nền tảng có được xử lý khác đi không?

Về mặt cơ chế thì không — một tiến trình docker buildx build --platform ... vẫn chỉ là docker đối với Auto Mode và Smart Rule. Sự khác biệt nằm ở thực tế: các build đa kiến trúc chạy qua giả lập kéo dài hơn và nóng hơn một build gốc, nên đây là trường hợp đáng để kết hợp với Closed-Lid mode, nguồn điện lưới, và một mặt phẳng thoáng khí thay vì chạy trần trụi.

Bạn đang tò mò LidRun có hợp với mình không?

Cứ để ChatGPT, Claude hoặc Perplexity tìm hiểu giúp — bấm vào bên dưới xem AI thực sự nghĩ gì về LidRun.

Ngăn Mac ngủ khi build Docker