Docker,检测主机的操作系统

Docker,检测主机的操作系统

我正在使用 Docker 创建 Web 应用的开发设置。我们的开发人员在 Windows、Mac 和 Linux 上运行。每个人都将使用 Linux 容器,但仍存在仅影响 Windows 用户的问题。

我并不想以不同于生产的方式运行应用程序。而是需要以不同的方式使用围绕开发人员设置的工具。

有没有办法从 Docker 容器中检测主机的操作系统?

答案1

你真的想这么做吗?

我知道您对框架挑战的答案并不满意,但请忍耐一下。

您遇到的问题是因为在 Windows 上运行基于 Linux 的 Docker 是一种黑客行为。当然,您可能会遇到 Windows 文件系统问题,但可能还有其他我不知道的问题。

现在,据我了解,您希望向项目添加特定于平台的解决方法,以允许在 Windows 主机上的 VM 中运行它。根据我的经验,我建议避免这样做。

  1. Windows 不是您项目的目标平台。添加针对 Windows 特定问题的解决方案会带来不必要的复杂性。不必要的复杂性意味着维护成本增加,并且可能出现原本不会发生的错误。

  2. 您很可能会遇到更多由文件系统不兼容引起的问题,这些问题严格来说不是项目问题,但在 Windows 下仍然会增加不必要的麻烦。例如,当某人在区分大小写的文件系统(即 Linux)上仅更改大小写文件名,而其他人将这些更改拉到 Windows 机器上时,git 就会崩溃。

真正的解决方案是在尽可能与预期相似的环境中进行开发。这意味着 - 在实际的 Linux 主机或 Linux VM 中。这将确保开发人员不会在仅存在于其开发平台上的问题上浪费时间(和金钱)。它还将确保他们不会错过在 Windows 上不会出现的问题。

您的客户并不关心产品是否能在 Windows 上的 Linux VM 中顺利运行。您的开发人员无论如何都必须熟悉 Linux,因为您的目标是将 Linux 作为唯一的平台。你真的想把资源花在现实场景中不存在的问题上吗?

答案2

我遇到了完全相同的问题。我们的 Angular Web 开发流程依赖于使用映射卷上的 webpack 检测到的文件更改。

不幸的是,Windows 不会传递文件系统事件(fseventsNPM 安装过程中始终发出警告的包

答案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)”的网络设备。

我没有测试环境,因此您需要自己为您的环境找到可行的解决方案。

相关内容