Peta dunia

 

EN: Read in English

Dunia D2: Resepi

Binaan berbilang peringkat

Anda akan belajar: masak di satu peringkat dan bungkus hidangan yang siap sahaja.

Teks BM belum disemak oleh penutur asli.

Disemak dengan Docker Engine 29 pada 31 Okt 2026

Masalahnya

Laman Kedai Kancil anda dibina dengan Node. Image satu peringkat anda 244MB, untuk satu laman HTML! Apa yang ambil ruang itu?

Pilih satu jawapan.

Tengok

Resepi ada dua baris FROM. Langkah bertanda build jalan dalam node:24-alpine. Peringkat akhir mula dari nginx dan salin /src/dist dari peringkat build. Transkrip Docker: $ cat Dockerfile FROM node:24-alpine AS build WORKDIR /src COPY package.json package-lock.json ./ RUN npm ci COPY index.html . RUN npm run build FROM nginx:1.30-alpine COPY --from=build /src/dist/ /usr/share/nginx/html/ $ docker build -t kedai:1.0 . [+] Building 2.5s (14/14) FINISHED docker:default => [internal] load build definition from Dockerfile 0.0s => => transferring dockerfile: 241B 0.0s => [internal] load metadata for docker.io/library/node:24-alpine 0.0s => [internal] load metadata for docker.io/library/nginx:1.30-alpine 0.0s => [internal] load .dockerignore 0.0s => => transferring context: 58B 0.0s => [build 1/6] FROM docker.io/library/node:24-alpine@sha256:8a32c8cf649a4 0.0s => => resolve docker.io/library/node:24-alpine@sha256:8a32c8cf649a49915a6 0.0s => [build 2/6] WORKDIR /src 0.0s => [internal] load build context 0.0s => => transferring context: 649B 0.0s => [build 3/6] COPY package.json package-lock.json ./ 0.0s => [build 4/6] RUN npm ci 1.2s => [build 5/6] COPY index.html . 0.0s => [build 6/6] RUN npm run build 1.2s => [stage-1 1/2] FROM docker.io/library/nginx:1.30-alpine@sha256:0e52bd05 0.0s => => resolve docker.io/library/nginx:1.30-alpine@sha256:0e52bd054126cdc0 0.0s => [stage-1 2/2] COPY --from=build /src/dist/ /usr/share/nginx/html/ 0.0s => exporting to image 0.1s => => exporting layers 0.0s => => exporting manifest sha256:3b7b615514d04c88d3e2c28410193368d61225c5d 0.0s => => exporting config sha256:ef2a3699bc2a7565ae894c58b5cf8671e027dc3c02b 0.0s => => exporting attestation manifest sha256:ff1f01a5f3560a8e72609ca69ecba 0.0s => => exporting manifest list sha256:662fb001df1cbe95c693093857d746ef5b21 0.0s => => naming to docker.io/library/kedai:1.0 0.0s => => unpacking to docker.io/library/kedai:1.0 0.0s

Laptop anda~/kedai

  • Tiada tingkap terbuka

Bekas (container)

  • Belum ada container

Pek beku (image)

  • nginx:1.30-alpine8 layer · 93.5MB
  • node:24-alpine4 layer · 244MB

0 container (0 berjalan), 2 image, 0 loker.

binaan berbilang peringkat (multi-stage build): Masak di satu peringkat, bungkus di peringkat lain. Hanya hidangan siap masuk image akhir. ada dua dapur. Peringkat build memasak dengan Node. Peringkat akhir mula baru dari nginx. COPY --from=build bawa hidangan sahaja: dist/.

Cuba

Susun resepi dua peringkat ini.

Baris pertama di atas. Susun ikut turutan. Guna anak panah, atau seret.

  • FROM node:24-alpine AS build
  • COPY --from=build /src/dist/ /usr/share/nginx/html/
  • FROM nginx:1.30-alpine
  • RUN npm run build
  • RUN npm ci

Cuba

Bina peringkat memasak sahaja sebagai kedai:build. Kemudian bina resepi penuh sebagai kedai:1.0. Bandingkan saiznya.

Laptop anda~/kedai

  • Tiada tingkap terbuka

Bekas (container)

  • Belum ada container

Pek beku (image)

  • nginx:1.30-alpine8 layer · 93.5MB
  • node:24-alpine4 layer · 244MB

0 container (0 berjalan), 2 image, 0 loker.

Teka

Adakah npm di dalam kedai:1.0?

Pilih satu jawapan.

Semak

which npm tak cetak apa-apa dalam kedai:1.0 dan keluar dengan kod 1. Dalam kedai:build ia cetak /usr/local/bin/npm. Transkrip Docker: $ docker build -t kedai:1.0 . [+] Building 2.5s (14/14) FINISHED docker:default => [internal] load build definition from Dockerfile 0.0s => => transferring dockerfile: 241B 0.0s => [internal] load metadata for docker.io/library/node:24-alpine 0.0s => [internal] load metadata for docker.io/library/nginx:1.30-alpine 0.0s => [internal] load .dockerignore 0.0s => => transferring context: 58B 0.0s => [build 1/6] FROM docker.io/library/node:24-alpine@sha256:8a32c8cf649a4 0.0s => => resolve docker.io/library/node:24-alpine@sha256:8a32c8cf649a49915a6 0.0s => [build 2/6] WORKDIR /src 0.0s => [internal] load build context 0.0s => => transferring context: 649B 0.0s => [build 3/6] COPY package.json package-lock.json ./ 0.0s => [build 4/6] RUN npm ci 1.2s => [build 5/6] COPY index.html . 0.0s => [build 6/6] RUN npm run build 1.2s => [stage-1 1/2] FROM docker.io/library/nginx:1.30-alpine@sha256:0e52bd05 0.0s => => resolve docker.io/library/nginx:1.30-alpine@sha256:0e52bd054126cdc0 0.0s => [stage-1 2/2] COPY --from=build /src/dist/ /usr/share/nginx/html/ 0.0s => exporting to image 0.1s => => exporting layers 0.0s => => exporting manifest sha256:b6170ae2cca287d1cfd093d147dcd0cbd726d4935 0.0s => => exporting config sha256:93f86126b8a273dc01166858398633f1510777c52c6 0.0s => => exporting attestation manifest sha256:b7fdc79b423faa069eb80d989f764 0.0s => => exporting manifest list sha256:02f32a2a17b285d903ae428e07cb0471f91d 0.0s => => naming to docker.io/library/kedai:1.0 0.0s => => unpacking to docker.io/library/kedai:1.0 0.0s $ docker run --rm kedai:1.0 which npm $ docker build --target build -t kedai:build . [+] Building 0.1s (11/11) FINISHED docker:default => [internal] load build definition from Dockerfile 0.0s => => transferring dockerfile: 241B 0.0s => [internal] load metadata for docker.io/library/node:24-alpine 0.0s => [internal] load .dockerignore 0.0s => => transferring context: 58B 0.0s => [build 1/6] FROM docker.io/library/node:24-alpine@sha256:8a32c8cf649a4 0.0s => => resolve docker.io/library/node:24-alpine@sha256:8a32c8cf649a49915a6 0.0s => CACHED [build 2/6] WORKDIR /src 0.0s => [internal] load build context 0.0s => => transferring context: 649B 0.0s => CACHED [build 3/6] COPY package.json package-lock.json ./ 0.0s => CACHED [build 4/6] RUN npm ci 0.0s => CACHED [build 5/6] COPY index.html . 0.0s => CACHED [build 6/6] RUN npm run build 0.0s => exporting to image 0.1s => => exporting layers 0.0s => => exporting manifest sha256:e61898031a5a7fb12428235d8f997b84668086645 0.0s => => exporting config sha256:57b36c9339cf71550e7b7f91a35c06f3ec538999b20 0.0s => => exporting attestation manifest sha256:237b6d641f10b568a71505d1cf518 0.0s => => exporting manifest list sha256:f1106e278ff1080160aed1a1670a7ba40809 0.0s => => naming to docker.io/library/kedai:build 0.0s => => unpacking to docker.io/library/kedai:build 0.0s $ docker run --rm kedai:build which npm /usr/local/bin/npm

Laptop anda~/kedai

  • Tiada tingkap terbuka

Bekas (container)

  • Belum ada container

Pek beku (image)

  • nginx:1.30-alpine8 layer · 93.5MB
  • node:24-alpine4 layer · 244MB

0 container (0 berjalan), 2 image, 0 loker.

which npm tak jumpa apa-apa dalam kedai:1.0. Di peringkat build, npm ada. Pelanggan tak pernah nampak dapur.

Anda berjaya!

Kini anda boleh masak di satu peringkat dan hantar hidangan sahaja.

Nak tahu lebih (pilihan)

Peringkat tanpa nama dipanggil ikut nombor: COPY --from=0. Nama lebih jelas. COPY --from juga boleh salin dari mana-mana image, contohnya --from=nginx:1.30-alpine. Kurang alat dalam image akhir juga bermaksud kurang lubang keselamatan.

Misi sebenar

  1. docker images

0 daripada 3 langkah siap · Tanda anda disimpan.