【问题标题】:Get information about the volume from inside the docker container从 docker 容器内获取有关卷的信息
【发布时间】:2020-11-04 07:14:33
【问题描述】:

在一个容器中,我构建了一个 (C++) 应用程序。源代码目录与--volume 共享。 如果 docker 在 Linux 上运行,共享目录会全速运行,但如果 docker 在 mac 上运行,docker 必须桥接共享,导致速度下降。因此,我必须在开始编译之前将整个源目录复制到容器中。但此复制步骤仅在非 Linux 主机上是必需的。

如何检测共享是否为“本地”共享?

我可以从容器中获取有关主机操作系统的信息吗?

更新

此工作流程背后的想法是为定义的环境设置映像,以便为多个平台(win、mac、linux)交叉构建产品。否则,每个开发人员都会安装不同的 Linux 操作系统/编译器/组件等。

作为一个 docker 新手,我认为这个镜像(包含所有必需的 3rdParty 组件/编译器)可用于在启动时在容器内构建应用程序。

【问题讨论】:

    标签: docker


    【解决方案1】:

    我能想到的一种解决方法是,您可以使用一种特殊的网络功能,它在 Mac 和 Windows 主机中都可用,但在 Linux 中不可用。

    这是一个特殊的 dns 条目,可用于从容器内部获取主机的 ip - host.docker.internal。阅读更多 here 和 here。

    现在你只需要一个命令来获取一个布尔值,如果它解析与否。由于我不知道您使用的是哪个 shell,因此我不能肯定地说,但 this 之类的内容应该可以帮助您。

    【讨论】:

    • 谢谢你的想法,我也想过这个。这个想法是在任何机器上使用映像,只需安装 docker 并且主机上没有任何服务。
    【解决方案2】:

    在我看来,您从错误的角度看待问题。

    首先,编译应该在构建时完成,而不是在运行时。如果您在容器中执行此操作,则意味着您正在使用构建工具运送映像,并不是说映像的用户需要源代码来运行映像。出于这个原因,在构建时进行编译是一个很好的做法,并且只提供一个带有二进制文件的镜像来运行。

    其次,在构建时编译速度很快,因为源代码被发送到 docker 守护程序并直接从那里访问,不需要卷。

    最后,回答你的最后一个问题,运行容器的是你。因此,您可以通过添加环境变量(例如)来告诉它有关它运行的主机的所有信息。当您在启动容器时已经拥有该信息时,仅运行容器并让它猜测它正在运行的位置过于复杂。

    【讨论】:

    • 感谢您的意见。关于我更新的问题,您是否会使用环境创建一个基本映像设置,并让开发人员构建另一个在运行时编译源代码的映像?如果来源发生变化,我就必须创建另一个图像......
    • ...重新构建整个项目,不能使用ccache。
    • 您可以随时创建开发基础镜像。在那里你安装你需要的所有依赖项。这是你可以分发的东西。然后,您可以扩展该映像并挂载或复制源代码。由于这是您在新映像中唯一要做的事情,因此它变得微不足道,并且主机操作系统实际上并不重要,因为用户/开发人员负责为他们选择最佳解决方案。
    【解决方案3】:

    我在创建容器时使用了--env DO_COPY=1。

    【讨论】:

      猜你喜欢
      • 2014-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-23
      • 2021-11-09
      • 1970-01-01
      • 2014-08-08
      • 2020-01-21
      相关资源
      最近更新 更多