【问题标题】:Dockerfile COPY vs "docker run ... cp"Dockerfile COPY 与“docker run ... cp”
【发布时间】:2021-05-02 10:51:26
【问题描述】:

我们有一个构建管道,它首先使用 dockerfile 进行 docker 构建。该 dockerfile 有许多 COPY 命令。我们还有一个后续步骤,使用 'cp' 命令执行 docker run,如下所示:

docker run --volume /hostDirA:/containerDirB --workdir /folderB dockerRepo:somebuildnum cp -R /hostDirC/. /containerDirB

首先,在重点之前,我的理解是 cp 命令正在从一个文件夹复制到另一个文件夹,这两个文件夹都是容器上的。这样理解正确吗?

第二,当 COPY 已经通过 dockerfile 在 docker build 中完成时,为什么要在 docker run 中以这种方式完成 cp?我们不将这个 cp 移到 dockerfile 中是否有正当理由?

【问题讨论】:

  • HostDirA 和 HostDirC 如何相互关联?如果一个在另一个之下,你需要证明这一点。你的 Dockerfile 中还有其他 VOLUME 规范吗?
  • COPY 适用于创建新图层。 cp 适用于将内容从容器复制到卷上。需要明确的是,docker run cp 不会创建新层。因此,它不能替代 COPY 指令。
  • 如果containerDirB 的路径中有一个符号链接,应该让它落在一个卷上,这也会更有意义。
  • 也就是说,“为什么这个预先存在的代码是这样写的?”问题通常要求我们成为读心者,这就是其中之一。有时会有额外的情况(例如上面提到的符号链接的可能性)。有时写它的人只是犯了一个错误。弄清楚哪个需要调查上下文——cp 发生的代码依赖,它是如何以及何时被调用的,它是否真的按预期工作? -- 这不适合我们的格式。
  • 你能稍微澄清一下目录名称吗?如果cp 源文件夹来自图像(不是主机目录),其目标文件夹是第二个--volume 目录,那么这似乎是在尝试将数据从构建到主机的图像中复制出来。

标签: docker dockerfile docker-build docker-run


【解决方案1】:

在不知道这些文件的用途的情况下,我们只能胡乱猜测。

卷用于数据持久性,而 COPY 用于运行进程所需但可能被销毁的数据。

为什么将数据复制到卷中而不是使用 COPY 命令的一种可能的有效场景是,需要初始化持久数据,并且他们不希望该初始化数据增加容器映像的膨胀。就像我说的,这只是一个疯狂的猜测。

另一种猜测是,Dockerfile 是在开发者之间共享的,并且组之间的初始化数据可能会有所不同,因此一组开发者可能会将不同的数据复制到卷中。

无论数据是什么,如果您关闭并移除容器,通过COPY 创建的数据将随容器一起消失,但通过主机上的cp 移动到卷中的数据仍保留在已挂载的目录中。当容器从最初放置在其中的内容运行时,该数据可能已更改,但当您移除容器并从映像中生成新容器时,它不会重置。

您应该询问开发人员所有文件的用途,以及这些文件是否需要持久化或者它们是否可以只是“短暂的”。这可能会回答您的问题,即为什么要按原样复制它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-06
    • 1970-01-01
    • 2017-03-12
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多