目錄

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日