Peta dunia

 

EN: Read in English

Dunia D2: Resepi

WORKDIR, RUN, ENV dan EXPOSE

Anda akan belajar: empat lagi baris resepi, dan kenapa EXPOSE tak buka tingkap.

Teks BM belum disemak oleh penutur asli.

Disemak dengan Docker Engine 29 pada 31 Okt 2026

Masalahnya

Satu resepi tulis COPY server.js . sahaja. Asas node tak tetapkan folder kerja. Di mana server.js mendarat?

Pilih satu jawapan.

Tengok

Resepi ada WORKDIR /app, COPY fail pakej, RUN npm ci, COPY server.js, ENV PORT=3000, EXPOSE 3000 dan CMD. Selepas build, pwd di dalam container cetak /app. Transkrip Docker: $ cat Dockerfile FROM node:24-alpine WORKDIR /app COPY package.json package-lock.json ./ RUN npm ci --omit=dev COPY server.js . ENV PORT=3000 EXPOSE 3000 CMD ["node", "server.js"] $ docker build -t api:1.0 . [+] Building 1.3s (10/10) FINISHED docker:default => [internal] load build definition from Dockerfile 0.0s => => transferring dockerfile: 200B 0.0s => [internal] load metadata for docker.io/library/node:24-alpine 0.0s => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [1/5] FROM docker.io/library/node:24-alpine@sha256:8a32c8cf649a49915a6 0.0s => => resolve docker.io/library/node:24-alpine@sha256:8a32c8cf649a49915a6 0.0s => [2/5] WORKDIR /app 0.0s => [internal] load build context 0.0s => => transferring context: 675B 0.0s => [3/5] COPY package.json package-lock.json ./ 0.0s => [4/5] RUN npm ci --omit=dev 1.2s => [5/5] COPY server.js . 0.0s => exporting to image 0.1s => => exporting layers 0.0s => => exporting manifest sha256:585b1f71ac0676785e33f0a3e3cc27827b1895c98 0.0s => => exporting config sha256:750e26492fb9c3a3ec58b7ad77189f271fe577845a2 0.0s => => exporting attestation manifest sha256:27da90d7c6fda90a44952daaae018 0.0s => => exporting manifest list sha256:8979cf17b5a929255f570efe837792395db7 0.0s => => naming to docker.io/library/api:1.0 0.0s => => unpacking to docker.io/library/api:1.0 0.0s $ docker run --rm api:1.0 pwd /app

Laptop anda~/api

  • Tiada tingkap terbuka

Bekas (container)

  • Belum ada container

Pek beku (image)

  • node:24-alpine4 layer · 244MB

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

WORKDIR /app ialah kaunter kerja anda. Semua baris selepasnya bekerja di situ. RUN memasak semasa membakar: di sini ia pasang pakej. pwd cetak kaunter itu: /app.

Cuba

Sesetengah baris bakar satu layer (lapisan). Yang lain cuma tampal nota pada pek. Asingkan mereka.

Seret kad ke dalam kotak. Atau ketik kad, kemudian ketik kotak.

      Cuba

      Image sudah dibina. Jalankan dengan tingkap 3000 terbuka, kemudian ketuk dengan curl.

      Laptop anda~/api

      • Tiada tingkap terbuka

      Bekas (container)

      • Belum ada container

      Pek beku (image)

      • api:1.08 layer · 244MB
      • node:24-alpine4 layer · 244MB

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

      Teka

      Resepi tulis EXPOSE 3000. Anda jalankan image tanpa -p. Boleh laptop anda capai port 3000?

      Pilih satu jawapan.

      Semak

      Container api berjalan tanpa -p. curl localhost:3000 jawab: Failed to connect to localhost port 3000: Couldn't connect to server. docker ps tunjuk 3000/tcp tanpa port laptop. Transkrip Docker: $ docker build -t api:1.0 . [+] Building 1.3s (10/10) FINISHED docker:default => [internal] load build definition from Dockerfile 0.0s => => transferring dockerfile: 200B 0.0s => [internal] load metadata for docker.io/library/node:24-alpine 0.0s => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [1/5] FROM docker.io/library/node:24-alpine@sha256:8a32c8cf649a49915a6 0.0s => => resolve docker.io/library/node:24-alpine@sha256:8a32c8cf649a49915a6 0.0s => [2/5] WORKDIR /app 0.0s => [internal] load build context 0.0s => => transferring context: 675B 0.0s => [3/5] COPY package.json package-lock.json ./ 0.0s => [4/5] RUN npm ci --omit=dev 1.2s => [5/5] COPY server.js . 0.0s => exporting to image 0.1s => => exporting layers 0.0s => => exporting manifest sha256:dc7800314dac8d66f0fd744a66287432eab0b43b6 0.0s => => exporting config sha256:00e8092d135c2dc5c2f015b20bb84dce74869227e7d 0.0s => => exporting attestation manifest sha256:9c156a337bb43693fe0cc0122bbdc 0.0s => => exporting manifest list sha256:6e4d6a6a470157a9a2bcaa8ec14418cc8756 0.0s => => naming to docker.io/library/api:1.0 0.0s => => unpacking to docker.io/library/api:1.0 0.0s $ docker run -d --name api api:1.0 9ae7e68b27cc6db02c55bc670db9280e69420649f964a99d83abb26f458d10b0 $ curl localhost:3000 curl: (7) Failed to connect to localhost port 3000 after 0 ms: Couldn't connect to server $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9ae7e68b27cc api:1.0 "docker-entrypoint.s…" 6 seconds ago Up 6 seconds 3000/tcp api

      Laptop anda~/api

      • Tiada tingkap terbuka

      Bekas (container)

      • Belum ada container

      Pek beku (image)

      • node:24-alpine4 layer · 244MB

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

      Ralat sebenar: Couldn't connect to server. Maksudnya: tiada tingkap terbuka. docker ps tunjuk 3000/tcp tanpa anak panah.

      Cuba

      ENV PORT=3000 cuma nilai asal. Bina arahan yang jalankan API di port 4000.

      Ketik kepingan ikut turutan yang betul.

      …

      Anda berjaya!

      Kini anda boleh guna WORKDIR, RUN, ENV dan EXPOSE.

      Nak tahu lebih (pilihan)

      Gabungkan arahan berkaitan dalam satu RUN dengan &&. Satu RUN, satu layer. EXPOSE juga bantu docker run -P, yang buka setiap port yang di-expose pada port laptop rawak.

      Misi sebenar

      1. docker build -t hello:1.1 .
      2. docker run --rm hello:1.1 pwd

      0 daripada 3 langkah siap · Tanda anda disimpan.