使用docker多阶段构建进行R开发和部署设置

Lor*_*ert 7 deployment r rstudio rstudio-server docker

问题

  • 为了进行开发,我想在相对较重的RStudio IDE中使用Docker 映像。我的项目也需要很多软件包,因此我创建了自己的docker文件,该文件在FROM语句中具有上述引用的图像。我们将此称为新的Dockerfile Dokerfile.development
  • 对于部署,我想使用基本的R映像,不带IDE,并且部署所需的依赖关系少,具有与开发中相同的设置,但没有IDE,运行测试所需的其他开发工具和依赖项。让我们将Dockerfile称为deplyoment Dockerfile.deployment

候选解决方案

所以现在我看到以下选项来创建这两个图像:

  • 一种做到这一点的优雅方法是c / p Dokerfile.development到my中的所有内容Dockerfile.deployment,但在语句中使用基于r的图像FROM。缺点:我总是需要保持多个Dockerfile为最新。如果我添加另一个图像进行测试,则我有3个Dockerfile,它们有99%的重叠。
  • 另一种方法是首先创建一个Dockerfile.deployment具有所有部署要求的软件。然后,在部署映像之上构建开发映像。Dockerfile.development在Dockerfile中或多或少地从Dockerfile中获取了RStudio映像的安装说明,以将RStudio添加到部署映像,但将deplyoment映像作为基础映像。缺点:我再也无法理解自己的Dockerfile中的代码了。

  • 使用多阶段构建,可以轻松地从一个映像中提取已构建的可执行文件(或几乎所有内容),然后将其用于另一映像,而不必复制构建可执行文件所需的所有依赖项。因此,我的想法是将RStudio映像中的相关文件提取到一个新映像中,该映像将成为我的部署映像。

我认为最后一个选项是首选,因为它是模块化程度最高的解决方案,并且在Dockerfile中的重复最少,维护负担也最低。

  • 我的狭窄问题是:是否可以从构建RStudio映像中提取一个(单个)可执行文件,并将其放在部署映像的顶部?

  • 我更开放的问题是:人们如何处理开发映像是部署映像以及可作为独立映像使用的其他一些工具的情况,并且他们希望避免重复,如候选解决方案下的两个第一个解决方案所示

Dir*_*tel 2

tl;dr:你不能。我想,按照你问的方式。也许你可以采取不同的做法。

更长的版本:

  • 不要将此视为油嘴滑舌的答案。
  • 我认为这涉及到我们如何打包源代码的核心
    • 从源代码库获取源代码
    • 或采用二进制聚合,例如作为.deb文件
    • 或者采用二进制元聚合,这里是 Docker 层
  • 您意识到存在包含组件的 Docker 层
  • 如果我正确地阅读了您的请求,您希望“反转”一层
  • 即从 RStudio 泊坞窗中获取 RStudio 部分
  • 我认为你不能
  • 从根本上讲,RStudio Docker 容器只是解压它们附带的 .deb
  • 所以你应该反转你的整个堆栈
  • 从 r-ver 或 r-base 开始,添加您的特定开发需求
  • 然后像我们在 RStudio 容器中一样添加 RStudio .deb
  • (法律语言:我们有明确的许可重新分发此内容,我怀疑这是可传递的)

希望这可以帮助。填写我的假设错误的所有空白。