Azure 開發者 CLI 發佈工作流程

這個 azd publish 指令允許你建立並推送容器映像檔到像 Azure Container Registry 或 Docker Hub 這類容器登錄檔,而不必立即部署到 Azure 資源。

透過將建置與推送步驟與部署步驟分開,你可以實作更進階的部署工作流程,例如「建置一次,遍布各地」的模式。 此方法適用於針對 Azure 容器應用 或 Azure Kubernetes 服務(AKS)的容器化應用。

為什麼要用 azd publish?

在標準 azd 工作流程中,指令 azd deploy 依序執行三個動作:

  1. 建置:將你的應用程式程式碼建置成容器映像檔。
  2. 推送:將該映像檔推送到登錄檔。
  3. 部署:更新你的 Azure 主機服務(像是容器應用程式)以執行新的映像檔。

雖然對內迴路開發來說方便,但此方法假設每次部署都需要重新建置。 在生產情境中,你通常會想:

  • 一次建置,遍布各地:先建一個工件(映像),在開發環境中測試,然後將 同一個工件 推送到生產環境,且不重新建置。
  • 集中化工件:使用單一共享的 Azure 容器登錄檔(ACR)來儲存所有環境的映像檔。
  • 提升安全性:確保只有經過驗證與測試的映像才部署到生產環境。

azd publish 僅處理步驟 1 與 2(建置與推送)即可實現這些情境。 你可以用 azd deploy 的特定參數來使用預先發佈的映像檔處理第三步(部署)。

主要功能

  • 獨立發佈:將映像檔發佈到登錄檔,且不觸發部署。
  • 自訂目標:使用 --to 旗標明確指定圖片應該推送的位置([registry/]repository[:tag]),覆蓋預設命名規則。
  • 第三方登錄檔支援:除了 Azure 容器登錄檔外,還能推送到外部登錄檔(例如 Docker Hub)。
  • Hook 支援:支援 prepublish 與 postpublish 自訂自動化的 hook。
  • 服務目標設定:目前支援託管於 Azure 容器應用程式 與 AKS 上的服務。

Usage

若要建立並發佈為您的azure.yaml所定義的特定服務之映像檔:

azd publish <service-name>

要建立並發布所有服務:

azd publish --all

參數

Flag Description
--all 發布所有定義於 azure.yaml的服務。
--from-package <image> 使用現有的本地映像檔或套件,而非從原始碼建置。
--to <image-ref> 指定目標影像參考(例如, <your-registry>.azurecr.io/my-app:v1)。 覆蓋 azure.yaml 的預設命名。

備註

對於設定為 services.<name>.docker.imagePassthrough: true的 azd publish 服務,則不會建置或推送映像檔。 它會改為重複使用已設定的遠端映像檔,並拒絕該服務的 --from-package 和 --to 旗標。

範例

將特定服務發佈到自訂標籤:

azd publish api-service --to <your-registry>.azurecr.io/api-service:v1.0.0

將本地映像檔發佈到遠端登錄檔:

如果你已經在本地建立了映像檔(例如: local-api:dev),你可以用 azd: 來標記並推送它:

azd publish api-service --from-package local-api:dev --to <your-registry>.azurecr.io/api-service:v1.0.0

情境:一次建立,全域部署

常見的生產工作流程是建立一次映像檔,然後在不同環境(如開發-> 測試-> 生產)中推廣。此過程可結合 azd publish 與 azd deploy 實現。

此情境不適用於配置為 services.<name>.docker.imagePassthrough: true的服務,因為 azd publish 不會為這些服務建置或推送映像檔。

  1. 發佈圖片:

    建立程式碼並推送到你的共用登錄檔。

    azd publish api-service --to <your-registry>.azurecr.io/my-app:v1.0.0
    
  2. 部署到開發階段:

    將特定的映像版本部署到開發環境中。 旗 --from-package 標指示 azd deploy 跳過建置/推送步驟,只更新服務設定。

    azd env select dev
    azd deploy api-service --from-package <your-registry>.azurecr.io/my-app:v1.0.0
    
  3. 部署到生產環境:

    在開發環境中測試後,將 相同的 映像檔參考部署到生產環境。

    azd env select prod
    azd deploy api-service --from-package <your-registry>.azurecr.io/my-app:v1.0.0
    

與其他命令的比較

Command 執行的行動 適用對象
azd publish 構建 -> 推送 CI/CD 管線、創建工件、「一次建構」工作流程。
azd publish --from-package 只用推 將預先建構的工件推送到環境中。
azd deploy 建置 -> 推送 -> 部署 標準開發迭代(內迴圈)。
azd deploy --from-package 僅部署 將預先建置/預先發佈的工件部署到環境中。
azd up 配置 -> 建置 -> 推送 -> 部署 開始,從零開始初始化新環境。

備註

預設 azd up 行為保持不變。 它仍然負責整個端到端的流程。 不過,如果需要,你可以自訂工作流程 azure.yaml 來使用 azd publish 。

對於已設定為 services.<name>.docker.imagePassthrough: true 的服務,azd publish 和 azd publish --from-package 不適用。 azd 重用已設定的遠端映像檔,而不是建立或推送映像檔。

配置於 azure.yaml

在 azure.yaml 中配置你的服務的預設 Docker 設定。 azd publish指令會遵守這些設定,除非被諸如類似--to的旗標覆蓋。

name: my-app
services:
  api:
    project: ./src/api
    host: containerapp
    docker:
      registry: 'docker.io/myusername' # Default registry
      image: 'my-api'                  # Default image name
      tag: 'latest'                    # Default tag

在此配置下,執行 azd publish api 會推入 docker.io/myusername/my-api:latest。

重用遠端影像 imagePassthrough

如果你的服務已經有一個已發佈的映像檔,而 azd 不應建置、推送或以其他方式管理它,請設定 services.<name>.docker.imagePassthrough: true。 啟用此選項時:

  • 設定 services.<name>.image 為最終且完全限定的遠端影像參考,包含明確的登錄檔。
  • 你無法將 docker.imagePassthrough 與 docker.remoteBuild 合併。
  • azd publish 不會為該服務建置或推送映像檔,並且會拒絕該服務的 --from-package 和 --to 旗標。
name: my-app
services:
  api:
    host: containerapp
    docker:
      imagePassthrough: true
    image: docker.io/myusername/my-api:v1.0.0

後續步驟