使用獨立建置對 Next.js 應用程式進行 Docker 化
介紹
Docker 近年來因允許將應用程式放置在容器內而受到歡迎。這些容器可以部署到任何環境,並且在所有環境中都以相同的方式工作,無論應用程式運行的平台如何,都提供統一行為。這些容器使用圖像,它們是應用程式的副本或壓縮快照。透過將它們放置在容器中,它們將完全按原樣顯示。這是一些人迫切需要的技術之一,而另一些人直到聽說它才意識到他們需要它。
就其本身而言,Next.js 是最受歡迎的 React 框架。與使用 webpack 或 Vite 等捆綁器的任何其他 JavaScript 應用程式一樣,使用專案的編譯版本進行生產。這稱為構建。建立旨在提供應用程式所需的最少量程式碼,使其與開發中的功能相同。這確保了 JavaScript 檔案非常輕量級,允許瀏覽器在盡可能短的時間內獲取和解釋它們,以呈現使用者介面或執行應用程式所需的任何任務。 ”
Next.js 特別提供了一個進一步減小建置大小的版本:獨立建置。如果我們使用 Docker 為 Next.js 應用程式建立映像,我們可以輕鬆地將我們建置的出色應用程式部署到任何環境,而無需擔心相容性或其他配置。在本文中,我們將了解如何實現它。
套件管理器
就我而言,我喜歡使用 pnpm 來減少 node_modules 資料夾的磁碟大小。因此,Next.js Docker 映像的範例使用了這個套件管理器,但如果您願意,您可以稍作調整以使用 npm 或 YARN。
Next.js 配置
在 next.config.js 檔案中,我們必須指定當應用程式編譯用於生產時,產生的建置類型將是獨立的。為此,我們需要包含以下內容:
這樣,應用程式的輸出將是獨立類型。
Dockerfile
代表我們的 Docker 映像的檔案是 Dockerfile。通常該檔案放置在專案的根目錄中。讓我們一步一步來創建它。
基礎鏡像
每個 Docker 映像都從基礎映像開始。在這種情況下,任何執行伺服器的 JavaScript 專案都需要像 Node.js 這樣的執行時間。我們將以與我們的專案相容的 Node.js 版本的 Docker 映像為基礎。就我而言,我喜歡使用 Alpine 版本的圖像,因為它更輕。但是,我們在建立鏡像時必須檢查是否有相容性問題,否則,我們必須使用「非Alpine」版本的鏡像。對於此範例,我使用 node:22.6.0-alpine3.19 影像作為基礎。
我們放置一個別名以在圖像的不同步驟或階段回收它。
系統和 pnpm 依賴項
下一階段是安裝相依性。在這種情況下,只需要一個系統相依性:libc6-compat。這裡提到了原因。
由於 Node.js 預設不包含 pnpm,因此需要啟動它並設定環境變量,以便快取已安裝的套件。
然後,我們必須設定工作目錄,以明確區分系統資料夾和應用程式資料夾。在本例中,我們使用 /app。
現在我們必須複製包含專案依賴資訊的檔案並安裝它們。
--frozen-lockfile 和 --prefer-frozen-lockfile 參數用於遵守 pnpm 鎖定檔案中指定的版本。
為了完成此階段,新增了 Sharp 庫。這是在 Next.js 生產環境中最佳化影像所必需的。
整個舞台是這樣的:
建立應用程式
下一階段是編譯 Next.js 應用程式。這是使映像正常運作的關鍵所在,因為 Dockerfile 的其餘部分沒有任何不同,或者您在任何其他範例中找不到。 在此階段,需要將專案中使用的環境變數作為建置參數傳遞,並在生成建置之前設定它們。
這是因為,由於應用程式有兩個工作時間,即建置時間和運行時間,如果環境變數在運行時不可用,則所有使用它們的靜態資源都不會具有它們的值並且該應用程式將無法正常工作。在此範例中,使用了三個環境變數:NEXT_PUBLIC_BACKEND_URL、FRONTEND_URL 和 JWT_SECRET。
然後,pnpm 被激活,工作目錄被設置,所有應用程式檔案被複製並產生建置。
整個舞台是這樣的:
運行應用程式
最後一個階段是執行應用程式。為此,我們先設定 Node 生產環境:
依個人喜好,Next.js 遙測被停用。也就是說,我們基本上不會將應用程式資料傳送到 Vercel 來透過錯誤診斷和使用指標來改進 Next.js。
此外,作為一個好的實踐,建議在 Docker 映像中使用非 root 使用者。例如,這可以避免容器有權存取主機網路時出現安全漏洞。為此,需要新增一個 nodejs 群組和一個 nextjs 使用者並指派 .next 資料夾屬性。
然後,複製獨立建置產生的檔案以建立與 Next.js 預設建構相同的結構。
由於我們建立了 nextjs 用戶,我們需要指定這將是要使用的用戶。
同樣,需要指定容器暴露的端口,以及將使用的節點端口和主機名,由於我們不知道確切的地址,因此主機名將為 0.0.0.0。
然後,從建置參數中指定應用程式執行階段的環境變數。
可以使用 docker-compose.yml 檔案中指定的環境變量,以及運行容器時,但是,在此上下文中的環境變量在構建時和運行時不同是沒有意義的.
最後,我們運行伺服器。
完整文件
完整的 Dockerfile 如下所示:
您也可以在此要點中找到該文件。
結論
為 Next.js 應用程式建立 Docker 映像一開始可能會令人畏懼,因為我們必須考慮所有因素。此外,人們普遍認為自託管 Next.js 應用程序,即。例如,在 Vercel 之外,情況很複雜。事實並非如此。了解了關鍵部分,其實很簡單。
我希望透過這些信息,您可以毫無問題地對您的 Next.js 應用程式進行 dockerize。你知道該怎麼做,如果你有任何問題或想分享一些東西,請留在評論中:)
以上是使用獨立建置對 Next.js 應用程式進行 Docker 化的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

JavaScript在Web開發中的主要用途包括客戶端交互、表單驗證和異步通信。 1)通過DOM操作實現動態內容更新和用戶交互;2)在用戶提交數據前進行客戶端驗證,提高用戶體驗;3)通過AJAX技術實現與服務器的無刷新通信。

JavaScript在現實世界中的應用包括前端和後端開發。 1)通過構建TODO列表應用展示前端應用,涉及DOM操作和事件處理。 2)通過Node.js和Express構建RESTfulAPI展示後端應用。

理解JavaScript引擎內部工作原理對開發者重要,因為它能幫助編寫更高效的代碼並理解性能瓶頸和優化策略。 1)引擎的工作流程包括解析、編譯和執行三個階段;2)執行過程中,引擎會進行動態優化,如內聯緩存和隱藏類;3)最佳實踐包括避免全局變量、優化循環、使用const和let,以及避免過度使用閉包。

Python和JavaScript在開發環境上的選擇都很重要。 1)Python的開發環境包括PyCharm、JupyterNotebook和Anaconda,適合數據科學和快速原型開發。 2)JavaScript的開發環境包括Node.js、VSCode和Webpack,適用於前端和後端開發。根據項目需求選擇合適的工具可以提高開發效率和項目成功率。

C和C 在JavaScript引擎中扮演了至关重要的角色,主要用于实现解释器和JIT编译器。1)C 用于解析JavaScript源码并生成抽象语法树。2)C 负责生成和执行字节码。3)C 实现JIT编译器,在运行时优化和编译热点代码,显著提高JavaScript的执行效率。

Python更適合數據科學和自動化,JavaScript更適合前端和全棧開發。 1.Python在數據科學和機器學習中表現出色,使用NumPy、Pandas等庫進行數據處理和建模。 2.Python在自動化和腳本編寫方面簡潔高效。 3.JavaScript在前端開發中不可或缺,用於構建動態網頁和單頁面應用。 4.JavaScript通過Node.js在後端開發中發揮作用,支持全棧開發。

JavaScript在網站、移動應用、桌面應用和服務器端編程中均有廣泛應用。 1)在網站開發中,JavaScript與HTML、CSS一起操作DOM,實現動態效果,並支持如jQuery、React等框架。 2)通過ReactNative和Ionic,JavaScript用於開發跨平台移動應用。 3)Electron框架使JavaScript能構建桌面應用。 4)Node.js讓JavaScript在服務器端運行,支持高並發請求。
