【问题标题】:Dockerfile setup for both production and development?用于生产和开发的 Dockerfile 设置?
【发布时间】:2018-06-15 10:10:31
【问题描述】:

我想知道人们如何将 docker 用于生产和开发。在开发中,我想挂载我的源/构建文件,以便能够快速轻松地进行更改。对于生产,我想在映像中包含源/构建文件。

这通常是如何完成的,是否有最佳或更常见的做法?

在我看来,理想情况下,我应该有一个 Dockerfile,它使用标志或环境变量之类的东西来设置 prod 或 dev 映像,但我找不到任何这样做的人的例子,我不确定它是如何做到的会完成的。

我还看到了一些具有用于生产和开发的独特 Dockerfile 的项目的粗略示例,但是如果我们不小心,维护单独的 Dockerfile 可能会随着时间的推移而出现分歧。

这两个都是明智的还是我可能误解了什么?我对 docker 比较陌生。使用类似设置的示例 Dockerfile 或项目会很棒。我对一开始就使用不良做法对我们的一些服务进行 docker 化持谨慎态度。

编辑:如果这会影响任何响应,我当前的所有应用程序都是基于 python 的。

【问题讨论】:

    标签: docker dockerfile


    【解决方案1】:

    除了 Kevin Wittek 的出色回答之外,事实证明这可能不是问题。

    我可以使用COPY 将文件复制到映像,但我可以简单地挂载在它们之上进行开发。

    如果还有其他需要安装的东西,比如只用于开发的 deps,我可以使用 ARG 来指定像 ARG APP_ENV=prod 这样的环境,然后用 --build-arg=dev 覆盖它,反之亦然。

    【讨论】:

    • 有一个警告:Dockerfiles 必须FROM 声明开头。因此,如果您需要构建不同的基础映像,就像我目前所做的那样,您不能使用这种方法,因为您不能在 FROM 语句之前运行 ARG 语句。
    • @RichardDunn 根据复杂性,您仍然可以使用 args 并覆盖基本图像所写的内容。它可能不是超级高效,但我不明白为什么它不起作用
    • 是的。我很好奇你是否可以对同一个基本映像使用两次 FROM。假设你可以,我想它只会使用相同的缓存版本,所以也许效率不会太低。
    【解决方案2】:

    一个好的方法是使用 Docker 的 multi-stage builds,因为它们允许您在包含您的开发依赖项的映像中构建您的工件,并且只在最终映像中使用您的工件和运行时依赖项。

    我通常建议不要在不同的环境中使用不同的 Dockerfile,这通常应该使用配置参数来实现(环境变量是一个很好的解决方案)。

    拥有更快的开发反馈周期很大程度上取决于 IMO 使用的语言。许多人会使用 IDE 以更经典的方式进行开发,并且只构建用于集成测试等的映像(根据我的经验,例如 Java 开发人员通常就是这种情况)。其他解释语言可能确实会从将您的源代码安装到开发环境映像中受益。在这种情况下,您可以将此映像合并到您的多阶段构建中。

    【讨论】:

    • 这有点让人放心,因为我是这样倾斜的。您能否提供更多有关使用配置参数的详细信息?我可能误会了什么。所以在一个 dockerfile 中,你可以使用环境变量之类的东西来触发不同的阶段?
    • 在启动/创建基于此映像的实际容器时,您通常会使用环境变量进行运行时配置。另见docs.docker.com/engine/reference/run/#env-environment-variables。为了实际使用环境变量来配置应用程序,您需要将其构建到您的应用程序中。见12factor.net/config
    • 我想我明白你在说什么。我的根本问题是创建图像。对于开发人员,我想用源文件挂载我的本地文件系统,而对于开发人员,我想在图像中包含源文件。我的应用程序目前都是基于 python 的,所以我不需要构建任何东西。重新阅读您的解决方案,您建议不要使用多个 dockerfile,但也提到合并开发映像。这不需要多个 dockerfile 吗?一个用于开发,一个用于生产,其中包含开发映像?
    • 我不明白,在理想的世界中,docker 多阶段构建的所有先前阶段都不应该通过 Jenkins 完成,然后最终构建将由 docker 完成吗?跨度>
    猜你喜欢
    • 2018-10-12
    • 2017-07-21
    • 2016-03-27
    • 2018-03-08
    • 2021-11-07
    • 2016-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多