Dockerfiles

什麼是 Dockerfile 以及如何使用它 Dockerfile 是建構 Docker 映像檔的配方。 這是工作流程:首先建立一個 Dockerfile,然後使用 docker build 從中建立一個 Docker 映像檔,最後從映像檔執行容器。 Dockerfile 是一個包含建構映像檔指令的文字檔案。 這些指令是部分組態語言,其中包含 FROM、LABEL、RUN、COPY、ENTRYPOINT、CMD、EXPOSE、ENV 等關鍵字。 讓我們建立我們的第一個 Dockerfile: 假設你有一個包含簡單 Node.js 應用程式的資料夾,由一個 app.js 檔案組成,該檔案列出了在運行應用程式之前需要安裝的幾個相依性,以及 package-lock.json。 在其中,創建一個名為 Dockerfile 的純文字檔案,不要加上副檔名,並包含以下內容: FROM node:14 WORKDIR /usr/src/app COPY package\*.json app.js ./ RUN npm install EXPOSE 3000 CMD ["node", "app.js"] 注:CMD 行中使用雙引號。單引號會導致錯誤。 在第一行中,我們指定要從哪個映像檔開始。這將是我們的基底映像檔。在這個案例中,它將使用基於 Alpine Linux 的官方 Node.js 映像檔,使用 Node 14。當從 Dockerfile 建立容器時,Docker 將從 Docker Hub 獲取該映像檔。 接下來,我們將工作目錄設定為 /usr/src/app,這意味著我們的所有命令都將在該資料夾中執行,直到我們再次更改它。這是我們已知在 Node 映像檔中存在的資料夾。 我們複製位於當前資料夾中的 package.json、package-lock.json(使用星號萬用字元)和 app.js 檔案到工作目錄中。...

nodemailer,如何將圖像嵌入電子郵件

我需要在使用 nodemailer 發送的電子郵件中嵌入圖像。 我試過使用附件的方式,但圖像卻被添加為附件。 因此,我將圖像以 base64 的形式嵌入到電子郵件正文中。 首先,我們需要添加一些引用: import fs from 'node:fs' import path from 'path' import { fileURLToPath } from 'url' const __filename = fileURLToPath(import.meta.url) const __dirname = path.dirname(__filename) 我們需要這樣做是因為在 ES 模塊中,__dirname 在作用域內無效,我們必須使用 fs 的 readFileSync() 函數來引用文件,但它需要絕對路徑,而不是相對路徑。 長話短說,就是這樣。 現在讀取圖像: const imageData = fs.readFileSync(__dirname + '/image.jpg', 'binary') 將其轉換為 base64 編碼的字符串: const src = `data:image/jpg;base64,${Buffer.from( imageData, 'binary' ).toString('base64')}` 最後,將其添加到電子郵件正文中: const mailOptions = { //... html: `<img style="width:800px;" src="${src}">`, }

如何使用 Node.js 下載圖片

當你需要程式化地從伺服器下載檔案時,你會如何下載一個檔案呢? 這個問題讓我自問不已,當我需要從伺服器下載檔案並將其儲存在本地時。 以下是我所使用的程式碼: const fs = require('fs') const request = require('request') const download = (url, path, callback) => { request.head(url, (err, res, body) => { request(url) .pipe(fs.createWriteStream(path)) .on('close', callback) }) } const url = 'https://…' const path = './images/image.png' download(url, path, () => { console.log('✅ 完成!') }) 這段程式碼使用了內建的 fs 模組以及 request 模組。 必須先安裝 request: npm install request 需要注意的是,request 模組最近已經被棄用,這意味著它已經被「完成」,不會再有新的功能被加入。但這並不表示它停止運作,也不表示我們該停止使用它。