簡體   English   中英

Node Docker構建和生產容器最佳實踐

[英]Node Docker Build and Production Container Best Practices

我有一個使用MongoDB的Node項目。 為了進行自動化測試,我們使用了Mongo Memory Server

對於Mongo Memory Server,我的Mongo不支持Alpine,因此無法在Alpine映像上運行

從文檔:

當前沒有針對高山linux的正式MongoDB版本。 這意味着我們不能為Alpine(或MongoDB官方不支持的任何其他平台)提取二進制文件,但是您可以使用已內置mongod的Docker映像,然后將MONGOMS_SYSTEM_BINARY變量設置為指向該二進制文件。 這應該允許您在可以安裝mongod的任何系統上使用mongodb-memory-server。

我可以使用Node基本映像在Docker容器中運行所有測試,但是對於生產而言,我想使用Alpine映像來節省內存。

所以我的Dockerfile看起來像這樣。

FROM node:x.x.x as test

WORKDIR /app

COPY . /app

npm install
npm run build # we use Typescript, this runs the transpilation
npm test # runs our automated tests

FROM node:x.x.x-alpine

WORKDIR /app

COPY --from=test /app/src /app/src
COPY --from=test /app/package.json /app/package.json
COPY --from=test /app/package-lock.json /app/package-lock.json
COPY --from=test /app/config /app/config
COPY --from=test /app/scripts /app/scripts

RUN npm install --production

RUN npm run build

在進行煙霧測試時,生成的Alpine圖像似乎可以正常工作。 我認為這是安全的,因為我將模塊安裝在高山映像本身中。

我想知道,這是最佳做法嗎? 有沒有更好的方法來做這樣的事情? 也就是說,對於Node來說,安全地擁有一個更大的測試容器和一個小的生產容器。

幾點

  1. 如果要進行兩次構建,那么多階段構建的意義何在。 我沒有做太多的node 但是,您希望進行多階段構建的原因是,您使用npm build來構建應用程序,該應用npm build會接收這些工件並將它們復制到映像中並以某種方式提供/運行。 go world中,這就像在構建器階段構建然后只運行二進制文件一樣。
  2. 您始終希望在聯合文件系統的頂部擁有變化最大的東西。 這意味着您不必復制整個應用程序代碼並運行npm install ,而應僅復制package.json並在其上運行npm install 這樣,docker可以緩存npm install的結果,並在頂部沒有任何更改的情況下節省下載節點文件的時間。 您的應用程序代碼比package.json更改方式更多
  3. 在第二階段,同樣的想法。 如果必須-首先復制package.json並運行npm install然后復制其余內容。
  4. 如果需要,可以有更多階段。 游戲的名稱是獲得最精簡最干凈的最終階段圖像。 多數民眾贊成在注冊表上。 其他所有內容都可以並且應該刪除。

希望能幫助到你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM