使用 Docker 文件中的 COPY 将文件夹从 Windows 主机操作系统复制到 Docker 映像中

Posted

技术标签:

【中文标题】使用 Docker 文件中的 COPY 将文件夹从 Windows 主机操作系统复制到 Docker 映像中【英文标题】:Copy folder from Windows host OS into Docker image using COPY in Docker file 【发布时间】:2021-10-27 07:22:28 【问题描述】:

我想将文件夹 D:\test 从我的主机操作系统 (Windows) 复制到我的 docker 映像。

我的 Docker 文件是 D:\Programs>

Docker 文件

FROM mcr.microsoft.com/windows/servercore:ltsc2019
SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]

RUN mkdir root
RUN cd root
WORKDIR /root
RUN mkdir test
COPY D:/test to /root/test
    #USING 'COPY' here instead of 'ADD' because of https://***.com/questions/24958140/what-is-the-difference-between-the-copy-and-add-commands-in-a-dockerfile

从文件夹 D:\Programs> 我运行命令docker build . -t test

但我得到错误:

复制失败:在构建上下文中找不到文件或被 .dockerignore 排除:统计测试:文件不存在

我尝试了命令COPY D:/test to /root/testCOPY ./test to /root/test

我知道会发生此错误,因为我从中复制的路径必须与构建上下文相关(docker build 中的 .)。它不能是构建上下文之外的系统上的任意路径。

我认为通过使用.,我会在我的构建上下文D:\Programs> 的上下文D:\ 中,但我想不是。我的 COPY 命令应该是什么样的?

我已经在这里检查过:

https://forums.docker.com/t/copy-files-from-windows-host-to-ubuntu-container/28757 Dockerfile COPY from a Windows file system to a docker container Dockerfile: Copy directory from Windows host to docker container

更新 1

我将 test 文件夹放在了我的 Dockerfile 所在的 D:\Programs 中,所以我现在有了结构:

D:\Programs
    \Test
    Dockerfile

然后我再次运行构建命令,尝试了 COPY test to /root/testCOPY ./test to /root/test,但都失败并出现上述相同的错误。

【问题讨论】:

【参考方案1】:

我假设您只是在 COPY D:/test to /root/test 中添加了 to 作为缩写,但我还是建议您检查一下。

如果您确实需要 D:/Programs 中的内容并且无法将其移动到当前构建上下文中的文件夹,那么我认为有两个通用选项:

    更改构建上下文 - 我建议将构建上下文设置为 D:/ 并将 D:/ 目录中除 Programs 之外的每个文件夹添加到 .dockerignore 文件中,然后您可以从一些文件中引用 Dockerfile D:/ 中某处的子目录,并在构建时根据需要复制文件

    在运行时创建绑定挂载 - 您可以在运行时将 D:/Programs 目录映射到容器内的文件夹 (/my-programs),然后将该文件夹中的文件复制到 /root/test 或仅使用绑定挂载文件夹 ( /my-programs)

如果将来可以在构建时使用绑定挂载,您可以在创建 docker 映像时使用第二个选项

【讨论】:

查看我的更新 1,我已经尝试将我需要的内容移动到我的构建上下文中,但它仍然不起作用 我从更新 1 中了解到,您从 D:\Programs\test 运行了 docker build 命令(将该文件夹作为构建上下文),我错了吗? 我明白我的更新是多么令人困惑。但是,是的,你错了,请参阅更新的更新 1 好的,但是结构很清楚,你在运行docker build时将哪个文件夹设置为构建上下文? 哇...这是一个错字!我的COPY 命令中一直有to。而不是COPY test to /root/test,我不得不使用COPY test /root/test。您的示例 COPY 命令将我指向它。只需将其用作您的答案,我将奖励赏金【参考方案2】:

我知道如何做到这一点的唯一方法是在构建期间更改 dockerfile 位置,将复制的文件夹保留在上下文中。

如下:

'test' 文件夹位于D:/test

这样设置 dockerfile COPY 命令:

COPY test /root/test

假设 dockerfile 位于D:/Programs/dockerfile

在 CLI 中导航到 D:/

docker build -f ./Programs/dockerfile .

. 将“test”文件夹保存在构建上下文中。据我所知,您无法使用 docker build 转到父目录等,因此您希望留在父文件夹中并转到 dockerfile。

【讨论】:

再次测试了与更新中相同的文件夹结构,这绝对适用于我的机器。在D:\Programs 中运行docker build . 应该在提供时复制“test”: - 文件夹“test”在 D:\Programs 中 - COPY test /root/test 在 dockerfile 中只是为了检查一下,您的文件夹大小写是否相同?您已经在几个地方引用了“测试”和“测试”,因此值得一问。另外,您在上面的 COPY 命令中添加了“to”,我认为这不在您的 dockerfile COPY 命令中,仅用于这篇文章?【参考方案3】:

如果您从D:\Programs 运行docker build ... ,则该文件夹是 docker 构建上下文。 Dockerfile 中使用的所有文件都必须存在。

d:\filesd:\programs 之外,所以永远找不到。

你需要将files的内容复制到你运行命令的地方,你可以使用这个复制行

COPY samplefile1.txt /root/test

【讨论】:

谢谢。请查看我的更新 1,我将文件夹复制到构建上下文但仍然出现相同的错误

以上是关于使用 Docker 文件中的 COPY 将文件夹从 Windows 主机操作系统复制到 Docker 映像中的主要内容,如果未能解决你的问题,请参考以下文章

为啥 docker build 中的 COPY 未检测到更新

20-docker Dockerfile指令ADD和COPY的区别,添加目录方法

Dockerfile 常用指令 - 每天5分钟玩转 Docker 容器技术(16)

Dockerfile 常用指令 - 每天5分钟玩转 Docker 容器技术(16)

docker常用技巧

Docker COPY 文件使用 glob 模式?