使用 Node.js 寻找小型的 Docker 镜像

当你寻找小型图像时的记录

我读了一篇关于缩小Node.js镜像的文章,我想记录一下以前使用的Dockerfile的大小是多少。
我想使用与我读到的文章相同的应用程序(将Node.js Web应用程序Docker化|Node.js)。

重点有两个。

    • ncc を使う。 vercel/ncc: Compile a Node.js project into a single file. Supports TypeScript, binary addons, dynamic requires.

過去に ncc について書いていた。 zeit の ncc コマンドで node.js アプリを 1 ファイルにコンパイルしてみたメモ – Qiita

当時は、 zeit だったな。

素の(?) alpine を使う。 Image Layer Details – alpine:3.17 | Docker Hub

node.js 公式イメージの alpine だと npm が入っているだかなんだかで、素の(?) alpine にした記憶が。。

环境

    Docker 20.10.21
mkdir app
cd app

touch package.json
touch app.js
touch Dockerfile
{
  "scripts": {
    "build": "ncc build app.js --minify --out ncc-minify"
  },
  "dependencies": {
    "express": "^4.18.2"
  },
  "devDependencies": {
    "@vercel/ncc": "^0.36.0"
  }
}
"use strict";
const express = require("express");

const PORT = 8080;
const HOST = "0.0.0.0";

const app = express();
app.get("/", (req, res) => {
  res.send("Hello World");
});

app.listen(PORT, HOST, () => {
  console.log(`Running on http://${HOST}:${PORT}`);
});
FROM node:18 AS build

WORKDIR /app
COPY . .

RUN npm i
RUN npm run build

FROM alpine:3.17 AS production

RUN apk add --no-cache nodejs~=18

COPY --from=build /app/ncc-minify/ /app/

EXPOSE 8080
CMD ["node", "/app/index.js"]

建造

docker build -t nodejs18-min .

确认图像

docker images
REPOSITORY             TAG           IMAGE ID       CREATED             SIZE
nodejs18-min           latest        618d0cf78ed4   53 seconds ago      55.2MB

执行

docker run --init -it -p 8080:8080 nodejs18-min

确认行动

curl localhost:8080

最后

下次做的时候,用的是 distroless,正好之前看过一篇相关文章。

以上

广告
将在 10 秒后关闭
bannerAds