在上一篇文章中,我們了解到:
Docker 基礎知識
Docker 鏡像
Docker容器
構建 Node.js 鏡像并在容器中運行它
為我們的 Node.js 應用程序提供一個單獨的環(huán)境看起來不錯(對于基礎知識而言),但您必須構建一個映像并在進行每一個小更改后再次運行它。
如果您想要同步您的開發(fā)環(huán)境,以便一旦您對代碼進行更改,它會在您再次訪問 API 后自動反映,該怎么辦?對于開發(fā)環(huán)境來說聽起來很酷,對吧???
輸入綁定坐騎
官方文檔說,當您使用綁定掛載時,主機上的文件或目錄將掛載到容器中。文件或目錄通過其在主機上的絕對路徑引用。請在此處(https://docs.docker.com/storage/bind-mounts/)閱讀官方詳細信息。
簡而言之,它將應用程序目錄與容器內的目錄同步,以便您在主機中所做的任何更改都會立即反映在容器中。
這意味著如果您更改文件中的任何內容,它們將在正在運行的容器中自動更改。
Nodemon 和 package.json
由于您來自node.js世界,您會知道我們必須使用nodemon它來監(jiān)視根目錄中的文件,然后在檢測到文件更改后立即重新啟動node.js應用程序。
我全局安裝了 nodemon,所以我遇到了 docker 容器的問題,所以請通過運行以下命令來確保您nodemon的容器中有node_modules:
npm install --save-dev nodemon
您將擁有它devDependencies?,F(xiàn)在您應該scripts在中進行如下編輯package.json:
"scripts": { "start": "node index.js", "dev": "nodemon -L index.js", "test": "echo \"Error: no test specified\" && exit 1" },
最后,你的package.json應該看起來像這樣:
{ "name": "docker", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "start": "node index.js", "dev": "nodemon -L index.js", "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC", "dependencies": { "express": "^4.18.2" }, "devDependencies": { "nodemon": "^3.0.1" } }
我們現(xiàn)在已經完成了package.json更改。讓我們繼續(xù)更新Dockerfile
更新 Dockerfile
在我們從上一篇文章中得到這個之前:
FROM node:12.18.3-alpine3.12 WORKDIR /app COPY package.json /app RUN npm install COPY . /app EXPOSE 3000:3000 CMD ["node", "index.js"]
現(xiàn)在,由于我們已經更新package.json并且我們想在開發(fā)環(huán)境中運行它,因此我們必須運行以下命令:
npm run dev
為了使其出現(xiàn)在 Dockerfile 中,我們必須像這樣替換最后一行:
CMD ["npm", "run", "dev"]
總體 Dockerfile 應該如下所示:
FROM node:12.18.3-alpine3.12 WORKDIR /app COPY package.json /app RUN npm install COPY . /app ENV PORT 3000 EXPOSE $PORT EXPOSE 3000:3000 CMD ["npm", "run", "dev"]
我們還進行了以下兩項更改:
ENV PORT 3000 EXPOSE $PORT
3000我們現(xiàn)在直接在我們的環(huán)境變量中添加Dockerfile并公開它。
構建 Docker 鏡像
由于現(xiàn)在我們進行了更改,package.json因此我們必須根據(jù)之前學到的命令重新構建圖像:
docker build -t shameel-node-image .
運行 Docker 容器
從上一篇文章中,我們了解到了這個 docker 命令:
docker run -p 3000:3000 -d --name shameel-node-app -d shameel-node-image
這將從容器的內部端口(即,到的shameel-node-app端口)運行名為 docker 容器。shameel-node-imagedetached modeexposes3000hostMachine3000
文章來源地址http://www.zghlxwxcb.cn/article/332.html
現(xiàn)在,您需要使用一個新標志-v:
docker run -v <hostMachinePath>:<containerPath> -p 3000:3000 -d --name shameel-node-app -d shameel-node-image
如果你在 Windows 上,你可以這樣給出:
docker run -v "D:\shameel-node-docker":/app -p 3000:3000 --name shameel-node-app shameel-node-image
您必須給出 的絕對路徑hostMachine。在本例中,D:\shameel-node-docker是我的應用程序在 Windows 計算機中存在的絕對路徑。
但這使得我們的命令太長了。我們需要一個能夠以更干凈的方式為我們提供絕對路徑的解決方案。
在 Windows CMD 中,您可以使用以下命令獲取它%cd%,在 Linux Bash 中,您應該可以使用以下命令獲取它:$(pwd)
對于重擊
我使用 Git Bash 進行了嘗試,我希望它也能在 Linux 中的 Bash 中工作。
$ docker run -v "$(pwd):/app" -p 3000:3000 -d --name shameel-node-app shameel-node-image
我得到這個輸出,這意味著容器開始運行:
對于 Windows CMD
我運行了這個命令,它在 CMD 中就像一個魅力:
docker run -v "%cd%:/app" -d -p 3000:3000 --name shameel-node-app shameel-node-image
檢查安裝座
您現(xiàn)在已成功地將位置從主機安裝到容器并希望驗證它。
為此,命令的語法如下:
docker inspect <conainer-name>
對于我的情況,它變成這樣:
docker inspect shameel-node-app
然后從整個輸出中查找Mounts 。
如果您不想檢查所有內容而只想關注Mount,請運行以下命令:
docker inspect -f "{{ .Mounts }}" shameel-node-app
您應該能夠看到bind主機到容器的路徑。
如果您有 Docker Desktop,則可以選擇容器并單擊Bind mounts以查看:
Docker 桌面綁定掛載
避免node_modules同步
目前,如果您node_modules從主機中刪除。它也將從容器中刪除。
這不應該是一個想要的行為,因為我們已經node_modules在我們的Dockerfile. 因此,我們必須想出一種方法來同步除node_modules
我們將不得不使用-v具有更具體路徑的標志。
我在 CMD 中運行了這樣的命令:
docker run -v "%cd%:/app" -v /app/node_modules -d -p 3000:3000 --name shameel-node-app shameel-node-image
現(xiàn)在,您也可以從 Docker Desktop 進行驗證:
node_modules除了是 之外的一切MOUNT。
node_modulesnpm install現(xiàn)在通過我們的命令安裝Dockerfile,并且不再同步到主機。
驗證開發(fā)環(huán)境
目前我們有這個應用程序:
進行輕微更改并將其保存在文件中后,如下所示:
app.get('/', (_, res) => { res.send('Hello Shameel! How are you?'); } );
您可以在下圖中檢查nodemonDocker Desktop 日志中的重新啟動,一旦我們刷新頁面,我們應該能夠看到反映的更改
您也可以通過此命令檢查 CLI 中的日志:
docker logs <container>
對我來說,它是:
docker logs shameel-node-app
為什么應該進行只讀綁定掛載
目前,安裝是雙面的。如果您對容器中的目錄進行任何更改app,它將反映在您的主機中。
這是危險的,因為如果有人以某種方式訪問了您的容器,那么黑客就可以輕松地將惡意內容放入您的主機中。
命令中唯一的變化是添加了:ro確保掛載為只讀的命令。
bash 中的命令如下所示:
docker run -v "$(pwd):/app:ro" -p 3000:3000 -d --name shameel-node-app shameel-node-image
CMD 中的命令如下所示:
docker run -v "%cd%:/app:ro" -p 3000:3000 -d --name shameel-node-app shameel-node-image
結論
在這篇博客中,我們學習了如何在 docker 的幫助下通過合并綁定掛載并確保我們的開發(fā)更改在保存文件后立即得到反映,從而使 Node.js 中的開發(fā)變得容易。
快樂的編碼和容器化!???文章來源:http://www.zghlxwxcb.cn/article/332.html
到此這篇關于使用 Docker 輕松開發(fā) Node.js的文章就介紹到這了,更多相關內容可以在右上角搜索或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!