日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁(yè) > 科技  > 軟件

使用 Docker 搭建 NodeJS 開(kāi)發(fā)環(huán)境是一種什么體驗(yàn)?

來(lái)源: 責(zé)編: 時(shí)間:2024-07-12 17:22:01 136觀看
導(dǎo)讀前言最近和一些小伙伴在溝通這個(gè)博客全棧項(xiàng)目時(shí),會(huì)發(fā)現(xiàn)其中一些朋友在安裝依賴這個(gè)階段就出現(xiàn)問(wèn)題了,總是會(huì)問(wèn)我“為什么依賴安裝失敗?”這個(gè)問(wèn)題可能是前端或者 node 領(lǐng)域最常見(jiàn)的問(wèn)題了,基本上每個(gè)人都遇到過(guò),拉取一個(gè)項(xiàng)

前言

最近和一些小伙伴在溝通這個(gè)博客全棧項(xiàng)目時(shí),會(huì)發(fā)現(xiàn)其中一些朋友在安裝依賴這個(gè)階段就出現(xiàn)問(wèn)題了,總是會(huì)問(wèn)我“為什么依賴安裝失敗?”這個(gè)問(wèn)題可能是前端或者 node 領(lǐng)域最常見(jiàn)的問(wèn)題了,基本上每個(gè)人都遇到過(guò),拉取一個(gè)項(xiàng)目后,依賴都裝不成功,何談繼續(xù)使用呢?Yxm28資訊網(wǎng)——每日最新資訊28at.com

依賴安裝階段就失敗,一部分原因來(lái)自于依賴版本鎖的寬松性,很多時(shí)候我們不會(huì)鎖死一個(gè)依賴的版本號(hào),而是會(huì)采用^, ~ 這種范圍限制,這就會(huì)導(dǎo)致在npm install的時(shí)候,可能會(huì)嘗試去安裝一個(gè)更高版本的依賴,而這個(gè)更高版本的依賴可能會(huì)帶來(lái)它的一些依賴項(xiàng)的兼容性問(wèn)題,引起安裝階段報(bào)錯(cuò)。Yxm28資訊網(wǎng)——每日最新資訊28at.com

另一部分原因是 Node 版本導(dǎo)致的,因?yàn)槟承┌鼘?duì) Node 版本是有要求的,如果環(huán)境不符合要求,也會(huì)安裝失敗。Yxm28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片Yxm28資訊網(wǎng)——每日最新資訊28at.com

想要解決這類問(wèn)題,最好的辦法就是使用容器化完全隔離環(huán)境,因?yàn)槲覀兛梢栽?Dockerfile 中指定項(xiàng)目需要的運(yùn)行環(huán)境,這樣一來(lái),使用者的主機(jī)環(huán)境是什么 Node 版本大可不必操心。在上一篇文章中,我們學(xué)會(huì)了使用 Docker 構(gòu)建 NodeJS Express 鏡像并自動(dòng)化部署生產(chǎn)環(huán)境使用,但是開(kāi)發(fā)環(huán)境的問(wèn)題我們還未解決掉,本文就來(lái)學(xué)習(xí)一下怎么使用 Docker 構(gòu)建 NodeJS 開(kāi)發(fā)環(huán)境。Yxm28資訊網(wǎng)——每日最新資訊28at.com

需求梳理

我們很清楚,開(kāi)發(fā)環(huán)境下,最重要的一點(diǎn)是什么,那就是修改了代碼,能夠立即生效,方便快速調(diào)試,這種熱更新或者自動(dòng)重啟能力是至關(guān)重要的。Yxm28資訊網(wǎng)——每日最新資訊28at.com

能做到這一點(diǎn)的工具有很多,比如 Nodemon[3], PM2[4] 等,我更習(xí)慣使用 PM2,PM2 的 watch 特性可以讓我們快速開(kāi)發(fā)調(diào)試。Yxm28資訊網(wǎng)——每日最新資訊28at.com

接下來(lái)就說(shuō)說(shuō)怎么使用 Docker + PM2 搭建一個(gè)開(kāi)發(fā)環(huán)境。Yxm28資訊網(wǎng)——每日最新資訊28at.com

Docker + PM2 搭建 Node 開(kāi)發(fā)環(huán)境

在沒(méi)有使用 Docker 之前,我們就是用 PM2 來(lái)進(jìn)行開(kāi)發(fā)和部署 Express 項(xiàng)目的,也算是比較熟悉了,改造起來(lái)不會(huì)很難。Yxm28資訊網(wǎng)——每日最新資訊28at.com

準(zhǔn)備 PM2 配置文件

首先,我們準(zhǔn)備一個(gè)ecosystem.config.js,這是 PM2 配置文件,不管用不用 Docker 都用得上它。具體配置內(nèi)容就和原來(lái)保持一致即可。Yxm28資訊網(wǎng)——每日最新資訊28at.com

module.exports = {    apps: [        {            // 應(yīng)用名            name: 'blog',            // 啟動(dòng)腳本            script: 'app.js',            // –env參數(shù)指定運(yùn)行的環(huán)境            env: {                NODE_ENV: "development",                PORT: 8002,            },            watch: true,            ignore_watch: ["node_modules", ".git", ".github", '.gitignore', '.dockerignore', '.release-it.cjs', '*.md'],        }    ],};

我們開(kāi)啟了watch配置,這樣就可以做到修改源碼立即重啟服務(wù)。當(dāng)然,我們也不能隨便修改什么文件就重啟服務(wù),比如一些 ignore 文件,markdown 文件,修改了之后也不應(yīng)該重啟服務(wù),這就需要用到ignore_watch配置。Yxm28資訊網(wǎng)——每日最新資訊28at.com

Dockerfile for Dev

接著我們還是要寫 Dockerfile,為了和生產(chǎn)環(huán)境區(qū)分開(kāi),我們單獨(dú)新建一個(gè) Dockerfile.dev 文件。Yxm28資訊網(wǎng)——每日最新資訊28at.com

ARG NODE_VERSION=16.20.2FROM node:${NODE_VERSION}-alpineENV NODE_ENV developmentENV PORT 8002WORKDIR /appRUN npm install pm2-dev -gRUN --mount=type=bind,source=package.json,target=package.json /    --mount=type=bind,source=package-lock.json,target=package-lock.json /    --mount=type=cache,target=/root/.npm /    npm ciEXPOSE 8002CMD ["npm", "start"]

可以看到,我們通過(guò) RUN 指令安裝了一個(gè) pm2-dev 包,而非 pm2,這是官方推薦我們?cè)?Docker 容器中使用的,pm2-dev 具備 watch 和 restart 特性。Yxm28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片Yxm28資訊網(wǎng)——每日最新資訊28at.com

其中提到的 pm2-runtime 則是用于 Docker 生產(chǎn)環(huán)境的。Yxm28資訊網(wǎng)——每日最新資訊28at.com

構(gòu)建鏡像

構(gòu)建鏡像總是這樣的千篇一律,唯一的區(qū)別是這里用-f指定了 Dockerfile,因?yàn)槲覀円蜕a(chǎn)環(huán)境的 Dockerfile 區(qū)分開(kāi)。Yxm28資訊網(wǎng)——每日最新資訊28at.com

docker build -f Dockerfile.dev -t blog-express-dev .

啟動(dòng)容器

由于我們希望在啟動(dòng)容器后,還能利用 PM2 的 watch 特性做到修改源碼后自動(dòng)重啟服務(wù),這就必須把我們的源碼作為 Volume 掛載到容器中。所以 docker run 大概要這樣寫:Yxm28資訊網(wǎng)——每日最新資訊28at.com

docker run -dp 8002:8002 /--mount type=bind,source=${PWD},target=/app /--name blog-backend-dev /blog-express-dev

啟動(dòng)容器后,就可以測(cè)試服務(wù)的有效性了,我們隨意測(cè)試一個(gè)接口。Yxm28資訊網(wǎng)——每日最新資訊28at.com

curl localhost:8002/article/page

圖片圖片Yxm28資訊網(wǎng)——每日最新資訊28at.com

能得到這樣的響應(yīng)內(nèi)容,說(shuō)明服務(wù)一切正常。Yxm28資訊網(wǎng)——每日最新資訊28at.com

解決 watch 不生效問(wèn)題

當(dāng)我以為萬(wàn)事大吉時(shí),準(zhǔn)備最后測(cè)試服務(wù)的熱重啟是否正常。Yxm28資訊網(wǎng)——每日最新資訊28at.com

- const pageNo = Number(req.query.pageNo || 1);+ const pageNo = Number(req.query.pageNo || 3);

我把 article/page 對(duì)應(yīng)的控制器的默認(rèn)頁(yè)碼改為了 3,發(fā)現(xiàn)修改代碼后,服務(wù)并沒(méi)有重啟,curl 的結(jié)果毫無(wú)變化,這說(shuō)明 watch 特性沒(méi)有生效。Yxm28資訊網(wǎng)——每日最新資訊28at.com

我首先仔細(xì)檢查了我的各個(gè)配置項(xiàng),發(fā)現(xiàn)都沒(méi)有異常,于是就去網(wǎng)上找找有沒(méi)有人遇到我這種問(wèn)題,結(jié)果也沒(méi)找到。Yxm28資訊網(wǎng)——每日最新資訊28at.com

實(shí)在沒(méi)辦法,就到 PM2 的 issue 中去搜索 pm2-dev, Docker, watch 這種關(guān)鍵詞,確實(shí)找到了一些相似的問(wèn)題。Yxm28資訊網(wǎng)——每日最新資訊28at.com

首先是這位老哥提了個(gè)問(wèn)題,他說(shuō)使用 pm2-runtime 時(shí)能檢測(cè)到文件變化自動(dòng)重啟服務(wù),而 pm2-dev 卻不行。Yxm28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片Yxm28資訊網(wǎng)——每日最新資訊28at.com

這已經(jīng)是 2020 年提的 issue,我想著我也得留個(gè)言,萬(wàn)一解決了我也好知道。Yxm28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片Yxm28資訊網(wǎng)——每日最新資訊28at.com

但我也知道,這也解決不了問(wèn)題,我的留言不會(huì)馬上得到回復(fù)的,于是接著找其他的 issue,翻了好久又找到一個(gè)差不多的問(wèn)題。Yxm28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片Yxm28資訊網(wǎng)——每日最新資訊28at.com

雖然這里面說(shuō)的是在 Mac 上遇到這個(gè)問(wèn)題,但是我想著我也得試試,于是加了usePolling重新打鏡像運(yùn)行容器,結(jié)果還真的好了,修改源碼能夠立刻生效,開(kāi)發(fā)環(huán)境最關(guān)鍵的問(wèn)題解決了!Yxm28資訊網(wǎng)——每日最新資訊28at.com

小結(jié)

做一件事情,最怕的就是關(guān)鍵地方掉鏈子,功虧一簣,最欣喜的也是解決掉問(wèn)題的那一刻,雖然我知道解決完一個(gè)問(wèn)題還會(huì)有下一個(gè)棘手的問(wèn)題等著我,但是不礙事,做程序就是這樣,山重水復(fù)疑無(wú)路,柳暗花明又一村,人生亦如此!Yxm28資訊網(wǎng)——每日最新資訊28at.com

  • 開(kāi)源地址:vue3-ts-blog-frontend[1]
  • 專欄導(dǎo)航:Vue3+TS+Node打造個(gè)人博客(總覽篇)[5]

參考資料Yxm28資訊網(wǎng)——每日最新資訊28at.com

[1]vue3-ts-blog-frontend: https://github.com/cumt-robin/vue3-ts-blog-frontendYxm28資訊網(wǎng)——每日最新資訊28at.com

[2]express-blog-backend: https://github.com/cumt-robin/express-blog-backendYxm28資訊網(wǎng)——每日最新資訊28at.com

[3]Nodemon: https://nodemon.io/Yxm28資訊網(wǎng)——每日最新資訊28at.com

[4]PM2: https://pm2.keymetrics.io/Yxm28資訊網(wǎng)——每日最新資訊28at.com

[5]Vue3+TS+Node打造個(gè)人博客(總覽篇): https://juejin.cn/post/7066966456638013477Yxm28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-100715-0.html使用 Docker 搭建 NodeJS 開(kāi)發(fā)環(huán)境是一種什么體驗(yàn)?

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: Python 中的 @wraps 到底是個(gè)啥東西?

下一篇: 通用詳情頁(yè)的打造,你學(xué)會(huì)了嗎?

標(biāo)簽:
  • 熱門焦點(diǎn)
Top 主站蜘蛛池模板: 中卫市| 定结县| 西华县| 平凉市| 阿拉善盟| 赤水市| 林周县| 鲁甸县| 时尚| 城固县| 汶川县| 正镶白旗| 岑溪市| 藁城市| 兴宁市| 怀柔区| 常宁市| 大庆市| 犍为县| 宁德市| 儋州市| 杂多县| 方城县| 西畴县| 额尔古纳市| 江华| 屯留县| 平泉县| 松江区| 江油市| 荆门市| 柳江县| 新余市| 濮阳市| 同江市| 靖远县| 韶山市| 皋兰县| 宁晋县| 吉安市| 那坡县|