目錄
docker compose up 指令:參數說明與範例
docker compose up 建立並啟動 compose.yaml 中的服務。Compose 的入門見 Docker Compose 入門,其他 compose 指令見 docker compose 指令。
語法
docker compose up [參數] [服務名稱...]
不指定服務就是全部服務。up 會依序:建立網路、建立 Volume、需要時下載或建置映像檔、建立容器(設定有變動的會重建)、啟動容器。
參數
| 參數 | 說明 |
|---|---|
-d, --detach | 在背景執行。不加時日誌顯示在前景,按 Ctrl+C 停止 |
--build | 啟動前先建置映像檔 |
--no-build | 不建置,映像檔不存在就失敗 |
--pull always|missing|never | 啟動前是否拉取映像檔 |
--wait | 等到服務都在執行(有健康檢查的要 healthy)才返回,隱含 -d |
--wait-timeout 秒數 | --wait 的最長等待時間 |
--force-recreate | 即使設定沒變也重建容器 |
--no-recreate | 容器已存在就不重建 |
--no-deps | 不啟動 depends_on 的服務 |
--scale 服務=數量 | 啟動多個副本 |
--remove-orphans | 刪除 compose.yaml 中已經不存在的服務的容器 |
-V, --renew-anon-volumes | 重建匿名 Volume,而不是沿用舊容器的 |
--abort-on-container-exit | 任一容器停止就停止全部(不能和 -d 一起用) |
--exit-code-from 服務 | 以該服務的結束代碼作為指令的結束代碼,隱含上一項 |
-t, --timeout 秒數 | 停止容器時等待的秒數 |
-w, --watch | 監看檔案變動並同步或重建(見 Node.js 應用) |
--no-start | 只建立不啟動 |
--quiet-pull / --quiet-build | 不顯示拉取/建置的進度 |
--no-log-prefix、--timestamps、--no-color | 前景模式的日誌格式 |
--dry-run | 只顯示會做什麼,不真的執行 |
範例專案
services:
web:
image: nginx:1.30-alpine
ports:
- "8080:80"
depends_on:
- cache
cache:
image: redis:8-alpine
volumes:
- cache_data:/data
worker:
image: alpine:3.23
command: ["sh", "-c", "echo worker done"]
volumes:
cache_data:
啟動全部服務
$ docker compose up -d
[+] up 15/15
✔ Image redis:8-alpine Pulled 3.4s
✔ Network ref-compose_default Created 0.0s
✔ Volume ref-compose_cache_data Created 0.0s
✔ Container ref-compose-worker-1 Started 0.4s
✔ Container ref-compose-cache-1 Started 0.6s
✔ Container ref-compose-web-1 Started 0.8s
$ docker compose ps -a
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
ref-compose-cache-1 redis:8-alpine "docker-entrypoint.s…" cache 1 second ago Up Less than a second 6379/tcp
ref-compose-web-1 nginx:1.30-alpine "/docker-entrypoint.…" web 1 second ago Up Less than a second 0.0.0.0:8080->80/tcp, [::]:8080->80/tcp
ref-compose-worker-1 alpine:3.23 "sh -c 'echo worker …" worker 1 second ago Exited (0) Less than a second ago
worker 執行完 echo 就結束了,所以是 Exited (0),這是正常的一次性服務。
只處理部分服務
$ docker compose up -d --no-deps web
[+] up 1/1
✔ Container ref-compose-web-1 Running 0.0s
$ docker compose up -d --force-recreate web
[+] up 2/2
✔ Container ref-compose-cache-1 Running 0.0s
✔ Container ref-compose-web-1 Started 0.4s
$ docker compose up -d --wait cache
[+] up 1/1
✔ Container ref-compose-cache-1 Healthy 0.5s
--no-deps web:只處理web,不管它依賴的cache。設定沒有變動,所以只顯示Running。--force-recreate web:即使設定沒變也重建web(Started);沒有加--no-deps,所以depends_on的cache也被檢查(Running)。--wait cache:等到cache就緒才返回。redis 映像檔沒有定義健康檢查時,容器在執行就算就緒。
--scale:多個副本
$ docker compose up -d --scale worker=3 worker
[+] up 3/3
✔ Container ref-compose-worker-3 Started 0.5s
✔ Container ref-compose-worker-2 Started 0.3s
✔ Container ref-compose-worker-1 Started 0.2s
$ docker compose ps -a worker
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
ref-compose-worker-1 alpine:3.23 "sh -c 'echo worker …" worker 4 seconds ago Exited (0) Less than a second ago
ref-compose-worker-2 alpine:3.23 "sh -c 'echo worker …" worker 1 second ago Exited (0) Less than a second ago
ref-compose-worker-3 alpine:3.23 "sh -c 'echo worker …" worker 1 second ago Exited (0) Less than a second ago
--scale worker=3 讓 worker 有 3 個容器,名稱自動編號為 -1、-2、-3。有對應主機連接埠(ports)的服務不能直接擴充,因為主機連接埠會衝突。
--exit-code-from:在 CI 中執行測試
$ docker compose up --abort-on-container-exit --exit-code-from worker worker
[+] up 2/2
✔ Container ref-compose-worker-2 Removed 0.0s
✔ Container ref-compose-worker-3 Removed 0.0s
Attaching to worker-1
worker-1 | worker done
worker-1 exited with code 0
Aborting on container exit...
Container ref-compose-worker-1 Stopping
Container ref-compose-worker-1 Stopped
w Enable Watch d Detach
- 只執行
worker,它結束時(--abort-on-container-exit)整個up也結束,而up的結束代碼就是worker的結束代碼(--exit-code-from)。在 CI 中用來執行測試服務:測試失敗 → 指令失敗 → CI 失敗。 - 上一步
--scale建立的worker-2、worker-3這次被刪除了(Removed),因為沒有再指定副本數,回到預設的 1 個。
相關章節
動手練習
練習:修改範例的 compose.yaml,把 web 的連接埠改成 8081:80,用一個指令套用,並確認只有 web 被重建。
答案
docker compose up -d
輸出中 web 顯示 Recreated/Started,cache 顯示 Running(沒有變動),docker compose ps 中 web 的 PORTS 變成 0.0.0.0:8081->80/tcp。
常見問題
修改 compose.yaml 後要怎麼套用?
直接再執行 docker compose up -d。Compose 會比對設定,只重建有變動的服務。docker compose restart 不會套用新的設定,實測見 [docker compose 指令](/zh-tw/docker/compose-commands/)。
修改了 Dockerfile,up -d 為什麼沒有重新建置?
映像檔已經存在時,up 不會自動重新建置。加上 --build:docker compose up -d --build。
--wait 和 depends_on 的 service_healthy 有什麼不同?
depends_on 控制服務之間的啟動順序;--wait 讓 docker compose up 指令本身等到所有服務都在執行(有健康檢查的要 healthy)才返回,適合在腳本與 CI 中接著執行下一步。
更新於 2026年10月14日