這篇文章用一個簡單的 Dockerfile 範例,帶你走完「製作 Docker image」的完整流程:如何到 Docker Hub 挑選適合的基礎映像檔、自行撰寫客製化部分,最後用 `docker build` 建出自己的映像檔並上傳到儲存庫。文中同時整理了 FROM、ENV、ARG、RUN、COPY、CMD、ENTRYPOINT 等常用指令的用途。
如何製作 Docker Image?完整流程是什麼?
製作一個自己的 Docker image,流程可以拆成以下幾步:
- 到 Docker Hub 尋找適合的基礎容器或官方提供的映像檔
- 自行撰寫需要客製化的部分
- 在專案資料夾根部創建一個文字檔,命名為 `Dockerfile`
- 撰寫 Dockerfile 內容
- 執行 command line,切換到專案資料夾,執行建置指令:
```bash
docker build --tag NAME .
```
- 上傳映像檔至儲存庫
下圖是實際執行 `docker build` 的畫面:

Dockerfile 常用指令有哪些?FROM、CMD、ENTRYPOINT 差在哪?
先看一個實際的 Dockerfile 範例:

各個指令的作用整理如下:
| 指令 | 用途 |
|---|---|
| `FROM` | 從某個別人建好的容器開始製作自己的容器,例如 `centos:6.7` |
| `ENV` | 定義一些環境變數,後面的指令可以直接使用 |
| `ARG` | 在 build image 時可從外部帶入參數 |
| `WORKDIR` | 指定後續指令執行的工作目錄 |
| `RUN` | 在容器內下指令(安裝套件、執行腳本等) |
| `COPY` | 把本機檔案複製進 image 裡 |
| `CMD` | 容器啟動時要執行的主程式指令 |
| `ENTRYPOINT` | 與 CMD 類似,差別在於不會被 `docker run` 後面帶的指令蓋掉,而是相加 |
其中 `ARG` 搭配 build 指令的用法如下:
```bash
docker build --build-arg SCRIPT=tmp.js .
```
`CMD` 與 `ENTRYPOINT` 的差別是新手最容易混淆的地方:`docker run` 之後帶的指令會覆蓋 `CMD`,但會附加在 `ENTRYPOINT` 之後。需要固定執行入口時用 `ENTRYPOINT`,需要可替換的預設指令時用 `CMD`。
延伸閱讀
常見問題
Dockerfile 一定要放在專案根目錄嗎?
不一定要放在根目錄,但 `docker build` 預設會以當前目錄(`.`)作為 build context 尋找名為 `Dockerfile` 的檔案。放在其他位置時,可用 `-f` 參數指定路徑。
FROM 指令的作用是什麼?
`FROM` 指定以哪個現成的映像檔作為基礎,例如 `centos:6.7` 或官方的 `node`、`python` 映像檔。在自己的容器不需要從零開始製作,選一個合適的基礎映像檔再客製化即可。
CMD 與 ENTRYPOINT 有什麼不同?
兩者都定義容器啟動時執行的指令。差別在於 `docker run` 後面帶的參數會蓋掉 `CMD`,但會附加在 `ENTRYPOINT` 之後一起執行,所以固定入口用 `ENTRYPOINT`、預設參數用 `CMD`。
ARG 和 ENV 都能定義變數,差別在哪?
`ARG` 只在 build image 階段有效,可透過 `--build-arg` 從外部帶入;`ENV` 定義的環境變數會保留到容器運行階段,容器內的程式也能讀取。
建好的 image 要怎麼上傳到 Docker Hub?
先用 `docker tag` 把 image 標上 `<帳號>/<儲存庫>:<標籤>` 格式,再執行 `docker push` 上傳即可。上傳前需要先 `docker login` 登入 Docker Hub。
參考資料
最後更新
2026-08-28(原文發布於 2022-10-06,本文保留原始筆記內容並補上 GEO 結構。)
關於作者 {#author}
Claire Chang | 企業 AI 導入與流程轉型顧問。專注於 AI Agent 架構設計、ERP 系統整合與企業 AI 治理。
首次發布:2022-10-06
