【问题标题】:Is it possible/sane to develop within a container Docker在容器 Docker 中开发是否可能/理智
【发布时间】:2015-02-02 11:26:15
【问题描述】:

我是 Docker 新手,想知道是否可以(并且是一个好主意)在 docker 容器中进行开发。 我的意思是创建一个容器,执行 bash,安装和配置我需要的一切,然后开始在容器内进行开发。

容器成为我的主要机器(用于 CLI 相关工作)。 当我在旅途中(或当我购买新机器时)时,我只需推动容器,然后将其拉到我的笔记本电脑上。

这解决了必须保持和同步你的点文件的问题。

我还没有开始使用 docker,所以它是现实的还是应该避免的(spacke 磁盘问题和/或拉/推时间问题)。

【问题讨论】:

  • 这篇博文可能有点意思:nathanleclaire.com/blog/2014/07/12/…
  • 当我需要使用我不能或不想使用的工具和库时,我正在使用基于 x2go+xubuntu 和 x2go+xfce+debian/sid 的 docker 容器进行 gui 开发和调试直接安装 - 所以它不仅适用于 cli。

标签: docker


【解决方案1】:

是的。这是一个好主意,设置正确。您将像运行虚拟机一样运行代码。

用于创建构建系统的 Dockerfile 配置没有经过打磨,不会扩展 shell 变量,因此预安装应用程序可能有点繁琐。另一方面在构建自己的镜像创建新的用户和工作环境后,就不需要重新构建了,另外你可以通过run命令的-v参数挂载你自己的文件系统,这样你就可以拥有您将在主机和容器机器中需要的文件。它用途广泛。

> sudo docker run -t -i -v
/home/user_name/Workspace/project:/home/user_name/Workspace/myproject <container-ID>

【讨论】:

  • 开发过程中用户权限问题如何处理?如果您使用--user 将自己标识为主机开发桌面上的用户,则容器不会以root 身份运行,并且许多命令会失败(例如whoami -> cannot find name for user ID 1000)。如果您将用户 ID 1000 添加到容器中,则它不一定与用户 ID 为 2000 的其他系统匹配。
【解决方案2】:

我会反其道而行之,说这是个坏主意。我已经完成了尝试保持容器“长时间运行”并对其进行修改的工作,但后来意外丢失或删除了它。

在我看来,容器并不意味着是长时间运行的虚拟机。它们只是作为图像的实例。启动它,停止它,杀死它,重新启动它。

正如 Alex 所提到的,这当然是可能的,但在我看来,这与“Docker”的方式背道而驰。

我宁愿使用 VirtualBox 和 Vagrant 来创建虚拟机进行开发。

【讨论】:

  • 不应修改正在运行的容器,除非在修改被编码之前的快速测试目的或通过修改主机安装的卷。如果您遵循此规则,则“意外丢失或删除”容器绝对没有问题,因为您立即重新创建它。如果你不这样做 - 那么你可能没有遵循 docker 哲学,其他工具(流浪者)可能更适合你的需要。
  • 请注意,您必须故意删除带有docker rm 的容器。默认情况下,内容(即使已修改)仍然存在。注意是因为我只是不希望人们认为丢失数据是默认设置。尽管如此,我还是对 ryan1234 表示同情,因为我几乎总是出于习惯移除非运行容器。
  • 我从没想过要删除它们,也从不尝试将容器用作虚拟机。但你知道,有时你进去尝试一些事情,忘记你做了什么,它消失了,痛苦。
  • 我可以理解这是如何发生的,我可以想象它在某些开发环境中比其他环境更常见。例如,我用 PHP 开发 Web 应用程序。我的开发容器源自一个永不改变的 Apache 镜像。我正在编辑的代码位于容器中安装的主机目录中。 Apache 容器可以被删除并重新运行,它不会影响任何东西。但是,这仅适用于我有一组支持应用程序(Apache 等),它们与我的应用程序没有紧密耦合。我可以想象其他环境可能会有所不同。
  • 尽管我评论了在容器中复制卷的可能性,如果(无论原因是什么)你认为你的容器可能会意外地从共享卷中删除文件,你总是可以使用 COPY 命令dockerfile 来构建你的镜像。你有两个选择。
【解决方案3】:

用于开发的 Docker 容器非常方便。根据您的堆栈和首选 IDE,您可能希望将编辑部分保留在主机外部,并根据 Alex 的建议将带有源的目录从主机安装到容器。如果这样做,请注意使用 boot2docker 的 macOS x 上的潜在性能问题。

对于推动图像在开发环境之间同步的工作流程,我不抱太大期望。恕我直言,将 Dockerfile 与代码保持在一起并通过 SCM 方式进行同步是更直接的开始方向。我还携带支持 Makefile 以在同一位置构建图像/运行容器。

【讨论】:

    猜你喜欢
    • 2016-09-18
    • 2018-06-21
    • 2015-12-21
    • 2013-03-16
    • 1970-01-01
    • 2020-08-16
    • 1970-01-01
    • 2022-10-07
    • 2022-08-14
    相关资源
    最近更新 更多