Dockerfile 基本語法
Dockerfile 描述如何一步步建置出一個映像檔:
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
FROM:基礎映像檔WORKDIR:設定容器內工作目錄COPY:複製檔案進映像檔RUN:建置時執行的指令EXPOSE:宣告容器使用的連接埠(文件性質)CMD:容器啟動時執行的指令
建置映像檔
docker build -t myapp:1.0 .
-t 指定映像檔名稱與標籤(tag),. 是建置上下文(Dockerfile 所在目錄)。
多階段建置(Multi-stage Build)
Docker 推廣的一個重要技巧,是用「多個 FROM」把「建置環境」與「執行環境」分開,讓最終映像檔變得更小:
# 建置階段:包含完整的編譯工具
FROM golang:1.22 AS builder
WORKDIR /src
COPY . .
RUN go build -o app .
# 執行階段:只包含執行檔,映像檔小很多
FROM alpine:3.19
COPY --from=builder /src/app /usr/local/bin/app
CMD ["app"]
COPY --from=builder 只把編譯好的執行檔複製到最終映像檔,不會把整個 Go 編譯環境也打包進去。
.dockerignore
跟 .gitignore 類似,列出建置時不要複製進映像檔的檔案,例如:
node_modules
.git
*.log
這能加快建置速度,也避免不小心把機密檔案打包進映像檔。
分層快取
每一行指令都會產生一層,建議把「不常變動的步驟」(如安裝套件)放前面,「常變動的步驟」(如複製程式碼)放後面,修改程式碼後重新建置會更快。