Dockerfile - 基本概念

作者: 發布: 更新: 2 分鐘閱讀
所屬主題: 容器技術

Dockerfile 是描述如何建立 container image 的文字檔。每個指令都應有明確目的:選擇 base image、安裝 dependency、複製應用程式、設定工作目錄,最後指定 container 啟動時執行的程式。

常用指令

指令 用途
FROM 指定 base image 並開始新的 build stage
WORKDIR 設定後續指令的工作目錄
COPY 從 build context 或其他 stage 複製檔案
RUN 在 build 階段執行指令並產生 layer
CMD 提供 container 預設啟動命令或參數
ENTRYPOINT 指定 container 的主要 executable
ENV 設定 image 與 container 使用的環境變數
ARG 設定只在 build 階段使用的變數
EXPOSE 描述應用程式監聽的 port,不會自動發布 port
USER 指定後續 build 或 runtime 使用者

一般檔案優先用 COPY;只有確實需要 ADD 的遠端來源或自動解壓等能力時再使用 ADD

Node.js 範例

# syntax=docker/dockerfile:1
FROM node:22-alpine

WORKDIR /app

COPY package.json package-lock.json ./
RUN npm ci --omit=dev

COPY . .

ENV NODE_ENV=production
EXPOSE 3000
CMD ["npm", "start"]

先複製 lockfile 並安裝 dependency,再複製其餘程式碼,可以讓只有應用程式檔案變更時重用 dependency layer 的 build cache。範例中的版本只是示意;實際專案應使用受支援版本並定期更新 base image。

搭配 .dockerignore

.git
node_modules
npm-debug.log
.env*

Secret 不應透過 COPYARGENV 永久寫入 image layer;建置或執行時應使用平台提供的 secret 機制。

建置與執行

docker image build --tag my-node-app:1.0 .
docker container run --rm -p 3000:3000 my-node-app:1.0

EXPOSE 3000 只提供 metadata;-p 3000:3000 才把 container port 發布到 host。

回到 Docker 基礎學習路線,或複習 Docker Image 基本概念

官方參考資料