使用 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/test
和COPY ./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/test
和 COPY ./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:\files
在d:\programs
之外,所以永远找不到。
你需要将files
的内容复制到你运行命令的地方,你可以使用这个复制行
COPY samplefile1.txt /root/test
【讨论】:
谢谢。请查看我的更新 1,我将文件夹复制到构建上下文但仍然出现相同的错误以上是关于使用 Docker 文件中的 COPY 将文件夹从 Windows 主机操作系统复制到 Docker 映像中的主要内容,如果未能解决你的问题,请参考以下文章
为啥 docker build 中的 COPY 未检测到更新
20-docker Dockerfile指令ADD和COPY的区别,添加目录方法
Dockerfile 常用指令 - 每天5分钟玩转 Docker 容器技术(16)