当前位置: 首页 > 知识库问答 >
问题:

如何在不指定其他Dockerfile路径的情况下包含构建上下文之外的文件?

澹台俊达
2023-03-14

这基本上是关于如何包含Docker构建上下文之外的文件的后续问题:我在我所有的项目中都使用了大文件(几GB),这些文件保存在一个外部驱动器上,仅用于开发。

我想在构建docker容器复制将这些文件添加到docker容器中。上面链接的答案允许用户指定Dockerfile的不同路径,这可能会扩展构建上下文。我觉得这不现实,因为这需要将构建上下文设置为system root(?),能够包含单个文件。

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


共有3个答案

高飞翮
2023-03-14

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

COPY/absolute_path/to/hard drive/container/path

黄靖
2023-03-14
匿名用户

我认为您担心的主要问题是,在docker daemon构建映像时,您不希望将目录中的所有文件发送到docker daemon。当目录太大(以GBss为单位)时,构建映像需要很多时间。

如果要求在docker内部构建任何内容时只使用这些文件,那么可以将它们装载到容器中。

一种棘手的方式

>

  • 运行一个带有基本映像的容器,并在其中装入目录<代码>docker run-d-v本地路径:容器路径

    进入容器docker exec-itCONTAINER_IDbash

    运行构建步骤/建造一些东西。sh

    从正在运行的容器创建图像docker commit container_ID

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

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

    我尝试了我的一个docker映像,因为我想避免在映像构建期间将大量文件发送到docker守护程序

  • 楚帅
    2023-03-14

    关于你可以尝试的三点建议:

    是否包含一个远离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在尝试发送千兆字节层时存在网络问题。

    这有点过时,稍微打破了“自包含映像”模型,但是您可以将这些文件作为Docker绑定挂载提供,而不是将它们包含在映像中。您的应用程序需要知道如果数据不存在该怎么办。当您部署应用程序时,您还需要将文件与Docker映像和其他部署构件一起单独分发。

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

    只用于开发

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

     类似资料:
    • 问题内容: 如何使用Docker文件中的“ ADD”命令从Docker构建上下文之外包含文件? 从Docker文档中: 路径必须在构建上下文内;您不能添加../something/something,因为Docker构建的第一步是将上下文目录(和子目录)发送到docker守护程序。 我不想为了适应Docker而重组我的整个项目。我想将所有Docker文件保留在同一子目录中。 此外,似乎Docker

    • 路径必须在生成的上下文中;您不能添加../something/something,因为docker构建的第一步是将上下文目录(和子目录)发送到docker守护进程。 我不想重组我的整个项目只是为了在这件事上容纳Docker。我想把我所有的Docker文件都保存在同一个子目录中。 此外,Docker似乎还不支持(可能永远也不支持)符号链接:Dockerfile ADD命令不跟随主机#1676上的符号

    • 我有以下文件夹结构: 我有我的micro-hr文件夹,其中是我的主包,我有一个本地lib,它是rabbitmq 这是我的dockerfile: docker撰写: 这是我的包裹。我的主包后端/微hr上的json: 我不知道我错在哪里,基本上我在我的主包中使用npm链接链接到我的lib,并尝试在docker中创建文件夹,但无济于事。 docker构建错误: 步骤6/10:复制/rabbitmq/包。

    • 问题内容: 我怎么能包括为没有MANIFEST.in文件? 我的setup.py看起来像这样: 版本: 我就是无法加入。 还是此博客文章仍然正确? http://blog.codekills.net/2011/07/15/lies,-more-lies-and-python-packaging- documentation-on– package_data-/ 不过,在过去的一个小时中,我了解到这

    • 问题内容: 我已经将非Java文件存储在一个包中。我想从此包中读取文件,而不指定文件的绝对路径(例如C:\ etc \ etc …)。我应该怎么做? 问题答案: 使用getResourceAsStream 例如: 如果在同一包中将打开 也: 将打开包装 祝好运!:)

    • 在C语言中,我可以用和调用来创建新文件,当且仅当当前没有同名文件时。我还没能在哈斯克尔找到这样做的方法。我更喜欢提供的友好的东西,最好是为我完成所有棘手的异常处理。(我不一定期望它能正确地为我完成,但那是另一回事。)