這篇基本是之前《不安裝 Docker Desktop 使用 Windows Docker 容器》的後續。
在 Heresy 將手邊跑 GitLab Runner 的 Windows 電腦都移除 Docker Desktop、並手動註冊 Docker Daemon 後,直接測試 Docker 基本上都沒問題,但是當實際要跑 GitLab CI/CD 的工作的時候,卻在要執行「docker login」登入自己的 Docker registry 的時候,出現了下面的錯:
Error saving credentials: error storing credentials - err: exec: "docker-credential-wincred": executable file not found in %PATH%, out: ``
單就這個問題,網路上要找資料還算滿簡單的,在《docker-credential-wincred: executable file not found in %PATH%》裡面,就有人提到,在使用者路徑下,可以找到「.docker/config.json」這個檔案,打開後內容會類似下面的樣子:
{ "auths": { "xxx.xxx.xxx:5100": {} }, "credsStore": "wincred" }
而針對找不到「docker-credential-wincred」的這個問題,只要將最後的「“credsStore”: “wincred”」刪除就可以了。
(根據狀況,上面 “auths” : { … } 結尾的「,」也要刪除,以維持 JSON 格式的正確性)
不過後來又認真看了一下,這才發現「docker-credential-wincred」是所謂的 Docker Credential Helpers(GitHub),它的用處是去保護儲存下來的 Docker registry 的資訊。
如果是在不安裝 Docker Desktop 的情況下使用 Docker,在執行「docker login」的時候,應該就會出現下面的警告:
WARNING! Your password will be stored unencrypted in C:UsersHeresy.dockerconfig.json.
Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store
他的意思就是登入的密碼會以未加密的方法,儲存在「C:UsersHeresy.dockerconfig.json」這個檔案裡(不過也不是直接用明碼存就是)。
而像上面一樣,把「“credsStore”: “wincred”」拿掉的話,也會有同樣的警告。
所以,其實如果要講究安全性的話,應該不是把「“credsStore”: “wincred”」,而是要在使用者的 config.json 加上去;然後去下載 Docker 提供的「docker-credential-wincred」,然後放在系統可以找到的地方。例如之前有把 C:docker 加到系統的環境變數裡面,所以其實放到這邊也是個好選擇。
這樣的話,Docker 就會把登入資訊儲存在 Windows 提供的認證管理系統裡了~理論上,安全性應該是會更高一點的。
附註:
-
如果是安裝 Docker Desktop 的話,應該預設就會提供 wincerd 的相關檔案、設定。
而這次碰到的問題,基本上應該是移除 Docker Desktop 時沒有將所有對應的檔案都移除的關係。 -
GitLab Runner 由於是用系統服務的形式在跑的,所以他的設定檔在比較奇怪的地方,路徑是「C:WindowsSystem32configsystemprofile.dockerconfig.json」,需要系統管理者權限。
-
wincerd 的認證在 Windows 10 下可以透過搜尋「管理 Windows 認證」,找到管理的介面。