【问题标题】:How to include files outside of build context without specifying a different Dockerfile path?如何在构建上下文之外包含文件而不指定不同的 Dockerfile 路径?
【发布时间】:2021-07-14 00:16:04
【问题描述】:

这基本上是How to include files outside of Docker's build context? 的后续问题:我在所有项目中都使用大文件(几 GB),这些文件保存在外部驱动器上,仅用于开发。

我想在构建时将这些文件 COPYADD 放到我的 docker 容器中。上面链接的答案允许指定 Dockerfile 的不同路径,从而可能扩展构建上下文。我觉得这不切实际,因为这需要将构建上下文设置为系统根 (?),才能包含单个文件。

长话短说:是否有任何方法或解决方法来包含远离 docker 构建上下文的文件?

【问题讨论】:

  • 这听起来会更好地处理将大文件放在容器的卷中,而不是将其构建到图像中。理想情况下,映像是二进制文件和库,而不是您的数据和配置。

标签: docker


【解决方案1】:

您可以尝试的三点建议:

包含一个远离 docker 构建上下文的文件?

您可以通过主机上的cp(或tar)文件将自己的构建上下文构建到专用目录树中。您不必使用实际的源代码树或构建树。

rm -rf docker-build
mkdir docker-build
cp -a Dockerfile build/the-binary docker-build
cp -a /mnt/external/support docker-build
docker build ./docker-build
# reads docker-build/Dockerfile, and the files in the
# docker-build directory, but nothing else; only sends
# the docker-build directory to Docker as the build context

大文件 [...](几 GB)

Docker 不能很好地处理这么大的构建上下文。在过去,我至少看到docker build 在将构建上下文发送给自己的步骤上花费了很长时间,而docker pushdocker pull 在尝试发送 gigabyte+ 层时遇到了网络问题。

这有点 hacky 并且稍微破坏了“独立映像”模型,但是您可以将这些文件作为 Docker 绑定安装提供,而不是将它们包含在映像中。如果数据不存在,您的应用程序需要知道该怎么做。当您去部署应用程序时,您还需要将文件与 Docker 映像和其他部署工件分开分发。

docker run \
  -v /mnt/external/support:/app/support
  ...
  the-image-without-the-support-files

仅用于开发

在这个开发阶段,您可能完全不使用 Docker。使用本地源代码树和本地开发工具;根据需要对这些大型测试装置运行单元测试。仅在您即将运行预提交集成测试时才构建 Docker 映像;在开发周期中可能已经够晚了,您不需要这些文件。

【讨论】:

    【解决方案2】:

    我认为您担心的主要问题是您不想在构建映像时将目录的所有文件发送到 docker daemon。 当目录如此之大(以 GBss 为单位)时,构建映像需要大量时间。

    如果要求在 docker 中构建任何东西时只使用这些文件,则可以将它们挂载到容器中。

    一个棘手的方法

    1. 使用基本映像运行一个容器并在其中安装目录。 docker run -d -v local-path:container-path

    2. 进入容器docker exec -it CONTAINER_ID bash

    3. 运行构建步骤./build-something.sh

    4. 从正在运行的容器docker commit CONTAINER_ID创建镜像

    5. 标记图像 docker tag IMAGE_ID tag:v1。您可以从之前的命令中获取图像 ID

    从长远来看,这种方法可能看起来很繁琐,但如果你想构建 1 或 2 次图像,你可以尝试这种方法。

    我为我的一个 docker 镜像尝试了这个,因为我想避免在镜像构建期间将大量文件发送到 docker daemon

    【讨论】:

      【解决方案3】:

      复制命令获取源值和目标值, 只需将硬盘挂载点的完整绝对路径指定为 src 目录

      COPY /absolute_path/to/harddrive /container/path

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-05
      • 1970-01-01
      • 2018-05-27
      • 1970-01-01
      • 2011-03-02
      • 1970-01-01
      • 2019-08-16
      相关资源
      最近更新 更多