【问题标题】:Rebuild same docker image with only the additional changes in the Dockerfile仅在 Dockerfile 中进行额外更改即可重建相同的 docker 映像
【发布时间】:2016-12-01 11:30:09
【问题描述】:

我使用 Dockerfile 构建了一个 docker 镜像。构建映像后,我对 Dockerfile 进行了一些基本更改。是否可以仅通过其他更改重建相同的图像。由于创建图像需要很长时间,我不想完全构建它。提前致谢。

【问题讨论】:

    标签: docker docker-image docker-build


    【解决方案1】:

    所有 docker build 都以您描述的方式工作。

    唯一需要考虑的是层依赖关系。

    考虑 Dockerfile

    FROM something
    RUN  cmd1
    RUN  cmd2
    RUN  cmd3
    RUN  cmd4
    

    如果您更改cmd1,则所有层都将重新构建,因为它们可能与cmd1不同
    如果您更改cmd4,则只会重建此命令,因为它不会影响任何其他层。

    想想哪些命令需要以什么顺序运行——也许你可以通过重新排序语句来改进它。

    【讨论】:

      【解决方案2】:

      是的,如果您标记您的 docker 镜像 myimage,只需启动您的其他 Dockerfile

      FROM myimage

      并在此之后添加您的其他更改

      【讨论】:

      • 请注意,这是假设编辑/标记的图像将来可用,例如,保存在可访问的存储库中。虽然它可能有效,但它是一个非常脆弱的解决方案,因为它无法通过 Dockerfiles 或代码仓库重新创建。
      【解决方案3】:

      您无法通过更改重新构建它,您需要将持久数据存储在卷上。

      但是,要保存您的更改,您可以使用commit

      https://docs.docker.com/engine/reference/commandline/commit/

      根据容器的更改创建新图像

      docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

      将容器的文件更改或设置提交到 一个新图像。 这允许您通过运行 交互式外壳,或将工作数据集导出到另一台服务器。 一般来说,最好使用 Dockerfiles 来管理你的镜像 记录和维护的方式。 Read more about valid image names and tags.

      提交操作不会包含卷中包含的任何数据 安装在容器内。

      默认情况下,正在提交的容器及其进程将 提交图像时暂停。这降低了发生的可能性 在创建过程中遇到数据损坏 提交。

      【讨论】:

      • 请注意,虽然您可以这样做,但它对于 Docker 来说有点反模式。理想情况下,您希望将任何最终更新合并到您的 Dockerfile(或卷,如果需要)中。
      • 是的,但是他的 docker commit 只会反映在容器上,而不是镜像本身。
      猜你喜欢
      • 2014-11-24
      • 2016-10-13
      • 2021-04-25
      • 2020-06-02
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多