向主机公开非空docker容器目录

向主机公开非空docker容器目录,docker,Docker,因为可以有一个很好的Docker容器来运行整个内置程序,所以如果容器用于构建和运行代码的工具能够被主机访问,那将是非常棒的 设想以下用例: 假设您正在使用OpenJDK 12和Maven 3.6.1开发一个Java应用程序,以便构建、运行所有测试并将整个应用程序打包到一个可执行的.jar文件中 创建一个Docker容器,用作“构建容器”。该容器安装了OpenJDK 12和Maven 3.6.1,可用于构建和打包整个应用程序(您可以在开发过程中在本地使用它,也可以在构建服务器上使用它,在推送代码更

因为可以有一个很好的Docker容器来运行整个内置程序,所以如果容器用于构建和运行代码的工具能够被主机访问,那将是非常棒的

设想以下用例:

  • 假设您正在使用OpenJDK 12和Maven 3.6.1开发一个Java应用程序,以便构建、运行所有测试并将整个应用程序打包到一个可执行的.jar文件中
  • 创建一个Docker容器,用作“构建容器”。该容器安装了OpenJDK 12和Maven 3.6.1,可用于构建和打包整个应用程序(您可以在开发过程中在本地使用它,也可以在构建服务器上使用它,在推送代码更改时触发构建)
  • 现在,你真的想开始写一些代码。。。当然,您将继续在您喜爱的IDE(IntelliJ IDEA?)中打开您的项目,配置项目SDK和其他需要配置的东西,然后开始运行

    如果能够告诉IntelliJ(Eclipse、NetBeans、VSCode等等)简单地使用与构建容器使用的版本相同的工具,那不是很好吗?当然,您可以告诉IDE将构建委托给“构建容器”(Docker),但不设置适当的“Project SDK”(和其他配置),那么您将“在黑暗中编码”。。。您将失去使用功能强大的IDE进行开发的几乎所有好处。没有代码暗示,没有静态代码分析,等等。你的酷炫的IDE本质上被简化为一个简单的文本编辑器,它至少可以通过调用你的构建容器触发一个完整的构建

    为了继续从众多IDE特性中获益,您需要安装OpenJDK 12、Maven 3.6.1以及您需要的任何其他工具(本质上,就是您已经花时间配置Docker映像的工具),然后告诉IDE“这些”是它应该用于“此”项目的工具

  • 不幸的是,很容易在您的主机(本地)上意外安装错误版本的工具,这可能会导致“它在我的机器上工作”综合症。当然,在构建容器/服务器使用适当的工具和版本构建项目之后,您仍然会发现问题,但是。。。更不用说,当你碰巧在多个项目上工作时,必须在你的机器上维护一整套工具及其版本时(可能必须处理所有工具之间的各种不兼容或交互),事情会变得多么烦人(一个项目需要JDK 8,另一个需要JDK 11,另一个使用Gradle,而不是Maven,那么您还需要Node 10、Angular 5,但也需要Node 6,等等)

    到目前为止,我只遇到了各种时髦的解决方法,但没有“好”的解决方案。到目前为止,我发现最可以容忍的方法是从主机上的容器中手动公开(复制)工具(例如:定义一个双方共享的卷,然后执行一个手动脚本,该脚本不会将工具从容器复制到共享卷目录中,以便主机也可以访问这些工具)……虽然这样做可行,但不幸的是,它涉及一个手动步骤,这意味着每当更新容器时(例如:使用了某些工具的新版本,甚至是额外的、全新的工具)然后开发人员需要记住执行手动复制步骤(明确执行任何脚本),以便再次向主机提供所有最新和最好的内容(当然,这可能意味着将IDE配置更新为——但至少是版本升级——在很大程度上可以通过让工具驻留在非版本特定的路径来缓解)


    有人知道如何实现这一点吗?虚拟机是不可能的,而且似乎是一种过激的行为……我不明白为什么不能以只读方式访问Docker容器资源,并且在开发和构建过程中重用和引用适当的工具。

    Iam目前正在考虑相同的解决方案。我听说EclipseChe(在web浏览器中运行)可以访问您在容器中的项目工作区。然后您可以直接修改代码等。但我目前还不能分享任何过期信息。