Docker,偵測主機作業系統

Docker,偵測主機作業系統

我正在使用 Docker 為 Web 應用程式建立開發設定。我們有在 Windows、Mac 和 Linux 上運行的開發人員。每個人都會使用 Linux 容器,但仍然存在只影響 Windows 使用者的問題。

我不希望以與生產不同的方式運行應用程式。相反,圍繞開發人員設定的工具需要有所不同。

有沒有辦法從 Docker 容器內偵測主機的作業系統?

答案1

你真的想這樣做嗎?

我知道您對框架挑戰的答案不滿意,但請耐心等待。

您所面臨的問題之所以出現,是因為在 Windows 上執行基於 Linux 的 Docker 是一種駭客行為。當然,您可能會遇到 Windows 檔案系統問題,但可能還有其他我不知道的問題。

現在,據我了解,您希望向專案添加特定於平台的解決方法,以允許在 Windows 主機上的虛擬機器中運行它。根據我的經驗,我建議避免這種情況。

  1. Windows 不是您專案的目標平台。新增 Windows 特定問題的解決方案會帶來不必要的複雜性。不必要的複雜性意味著增加的維護成本和潛在的錯誤,否則這些錯誤不會發生。

  2. 您很可能會遇到更多由檔案系統不相容引起的問題,這些問題嚴格來說並不是專案問題,但在 Windows 下仍然會增加不必要的麻煩。例如,當有人在區分大小寫的檔案系統(即 Linux)上進行僅大小寫的檔案名稱更改,而其他人將這些更改拉到 Windows 電腦上時,git 就會崩潰。

真正的解決方案是在盡可能類似於預期的環境中進行開發。這意味著 - 在實際的 Linux 主機或 Linux VM 中。這將保證開發人員不會在僅存在於其開發平台上的問題上浪費時間(和金錢)。它還將保證他們不會錯過 Windows 上未出現的問題。

您的客戶並不關心產品是否在 Windows 上的 Linux VM 中運作良好。無論如何,您的開發人員都必須熟悉 Linux,因為您的目標是將 Linux 作為您的唯一平台。您真的想將資源花在現實場景中不存在的問題上嗎?

答案2

我也遇到同樣的問題。我們的 Angular Web 開發流程取決於使用 webpack 在映射磁碟區上偵測到的檔案變更。

不幸的是,Windows 不會傳遞檔案系統事件(該fsevents套件在 NPM 安裝期間始終發出警告)

答案3

對於 macOS 或任何作業系統,您可以讓開發人員在其本機 shell 設定檔中進行設定:

export IS_HOST_MACOS='true'
export HOST_UNAME=$(uname)

然後,透過以下方式傳遞到 docker:

docker run -e IS_HOST_MACOS -i HOST_UNAME

最後,在一些 docker 腳本中使用它:

# This is meant to help developers know when the server has booted
if [ -n "${IS_HOST_MACOS+1}" ]; then
  [ "$IS_HOST_MACOS" == "true" ] && echo '{"Nginx is ready":""}';
fi

答案4

由於容器是在模擬環境中執行的,因此您可以透過提供的虛擬硬體來區分 Windows 和 Linux 主機。

例如,從 這個答案 我推斷 Windows 上的 Docker 將會建立一個名為「vEthernet (DockerNAT)」的網路裝置。

我沒有測試環境,因此您需要為您的環境找到可行的解決方案。

相關內容