為何無法 Code Engine 取回映像檔?
當您部署 Code Engine 應用程式或執行工作時,會收到一則包含 Unable to pull the image 的錯誤訊息。
若要對此問題進行疑難排解,請確認映像檔存在且您具有映像檔的存取權。 請確認是否符合以下條件。
-
若要確認應用程式或工作的映像檔存在,請檢閱錯誤訊息,以取得失敗的相關資訊。
-
若要在 Code Engine中部署應用程式或執行工作,您需要先建立容器映像檔,其中包含應用程式需要執行的所有執行時期構件,例如執行時期程式庫。 您可以使用許多不同的方法來 建立容器映像檔,包括使用 Code Engine中提供的建置容器映像檔特性從原始碼建置應用程式。 您可以從公用或專用映像檔登錄下載映像檔。 如需存取專用登錄的相關資訊,請參閱 新增專用容器登錄的存取權。
-
如果您在 Code Engine CLI 中使用
ibmcloud ce app create、ibmcloud ce job create或ibmcloud ce jobrun submit指令,請使用REGISTRY/NAMESPACE/REPOSITORY:TAG格式來指定用於應用程式或工作的映像檔名稱,其中REGISTRY和TAG是選用項目。 如果未指定REGISTRY,則預設值為docker.io.如果未指定TAG,則預設值為latest。 如需用來指定映像檔登錄之格式的相關資訊,請檢閱這些指令。
請嘗試下列解決方案來解決問題。
-
您未獲授權。 如果您沒有存取參照映像檔的許可權,則應用程式建立不會完成,且會發生錯誤。 您會收到包含
Unable to pull映像檔的錯誤訊息。-
若要確認您可以存取參照的映像檔,請驗證映像檔的位置,並確認您有權存取映像檔。
-
如果映像檔位於容器映像檔登錄 (例如 Docker Hub 或 IBM Cloud® Container Registry),請確認您已新增對 Code Engine 的登錄存取權,且您正在使用正確的登錄密鑰。 如需在容器映像檔登錄中使用映像檔的相關資訊,請參閱 新增對專用容器登錄的存取權。
-
-
已超出儲存器登錄配額。
- 透過執行
ibmcloud ce jobrun events --jobrun JOBRUN_NAME指令來檢查是否有ImagePullBackOff錯誤; 例如,
ibmcloud ce jobrun events --jobrun myjobrun- 如果系統事件中的錯誤類似於下列訊息,則此錯誤指出已超出登錄配額。 請考量升級方案。 如需 IBM Cloud® Container Registry 服務方案及配額限制的相關資訊,請參閱 關於 IBM Cloud Container Registry。
403 Forbidden - Server message: denied: You have exceeded your pull traffic quota for the current month. Review your pull traffic quota and pricing plan. - 透過執行
-
儲存器登錄需要鑑別。
- 如果系統事件中的錯誤類似於下列訊息,則此錯誤指出對登錄的存取不存在或可能需要授權。 請檢查您的認證是否具有登錄的適當存取權。
Failed to pull image "<image_name>": rpc error: code = Unknown desc = failed to pull and unpack image "<image_name:image_tag>": failed to resolve reference <image_name:image_tag>": pull access denied, repository does not exist or may require authorization: server message: insufficient_scope: authorization failed. -
Code Engine 在容器登錄中找不到您的映像檔。
在此實務範例中,您的映像檔存在且登錄存取權可運作,但 Code Engine 找到的映像檔與預期用於特定應用程式修訂的映像檔不同。 儲存器登錄映像檔摘要不符合應用程式修訂的映像檔預期摘要。
當您部署應用程式或新的應用程式修訂時,除非為映像檔指定標籤,否則會下載並部署所參照容器映像檔的最新版本。 如果為映像檔指定了標籤,則會將已標記的映像檔用於部署。
如果您建立較新版本的映像檔,且其標籤與應用程式所參照的原始映像檔相同,則會改寫儲存器登錄中的原始映像檔。 不過,Code Engine 找不到這個較新的映像檔,因為較新的映像檔具有不同於應用程式修訂摘要的摘要。 與特定應用程式修訂相關聯的映像檔具有唯一儲存器登錄摘要,且 Code Engine 在應用程式修訂的生命期限內使用此摘要。
如果您建立更新版本的映像檔,且其標籤與原始映像檔相同,則會改寫儲存器登錄中的原始映像檔,並變成未標記。 會標記較新的映像檔,且此較新的映像檔具有不同的摘要。 您的 Code Engine 應用程式未使用這個較新的映像檔,因為較新的映像檔具有與應用程式修訂所參照的映像檔摘要不同的摘要。如果原始參照的映像檔仍然存在,則 Code Engine 仍然可以建立應用程式修訂的新實例。 如果應用程式最初參照的映像檔不存在,Code Engine 會找不到預期的映像檔摘要,且應用程式會因為無法取回映像檔而失敗。 當您清除及刪除映像檔時,以及當您配置容器登錄的保留原則時,請小心。 改寫已標記的映像檔沒有問題。 不過,如果您使用已啟用的保留原則來改寫映像檔 (刪除未標記的映像檔),或者如果您手動觸發清除未標記的映像檔,則可能會發生問題。
如果系統事件中的錯誤類似於下列訊息,則此錯誤指出 Code Engine 無法從登錄名稱空間取回映像檔。 請檢查映像檔的標籤是否指向正確的映像檔摘要。
Unable to pull the image. Image "<image_name>" does not exist in the registry namespace. Check your registry repository and tag. If the image exists in the repository, check whether the specified tag points to the correct image digest.若要將使用相同標籤推送的較新映像檔與應用程式搭配使用,您必須 更新應用程式,以建立參照較新標籤映像檔的新應用程式修訂。
-
Code Engine 無法驗證您的容器註冊表。
在這種情況下,您的映像存在,註冊表存取正常,且設定的註冊表密碼有效,但 Code Engine 無法驗證您的容器註冊表。 您可能會看到類似下圖所示的錯誤訊息:
ErrImagePull : failed to pull and unpack image "<image name>": failed to resolve reference "<image name>": failed to authorize: failed to fetch oauth token: unexpected status from GET request to...檢查您是否已為帳戶啟用
Restrict IP address access(請參閱 允許特定 IP 位址 )。 如果啟用,則只有允許的 IP 位址才能驗證您帳戶的 IBM Cloud®,。 這將會阻止 Code Engine 認證到您的容器註冊表,因而無法拉取您的映像。 您需要新增 Code Engine 專案的public和privateIP 位址。 請參閱 Code Engine 公共和私有 IP 位址,瞭解如何識別這些 IP 位址。
下一步
若要進一步瞭解映像檔疑難排解,請參閱 映像檔除錯。
如需使用映像檔考量對應用程式、工作及建置進行疑難排解的相關資訊,請參閱下列主題。