[英]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來說,安全地擁有一個更大的測試容器和一個小的生產容器。
幾點
node
。 但是,您希望進行多階段構建的原因是,您使用npm build
來構建應用程序,該應用npm build
會接收這些工件並將它們復制到映像中並以某種方式提供/運行。 在go
world中,這就像在構建器階段構建然后只運行二進制文件一樣。 npm install
,而應僅復制package.json
並在其上運行npm install
。 這樣,docker可以緩存npm install的結果,並在頂部沒有任何更改的情況下節省下載節點文件的時間。 您的應用程序代碼比package.json
更改方式更多 package.json
並運行npm install
然后復制其余內容。 希望能幫助到你。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.