在 Docker 文件中使用 COPY 将文件夹从 Windows 主机 OS 复制到 Docker 图像
Copy folder from Windows host OS into Docker image using COPY in Docker file
我想将文件夹 D:\test
从主机 OS (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
从文件夹 D:\Programs> I 运行 命令 docker build . -t test
但是我得到错误:
COPY failed: file not found in build context or excluded by .dockerignore: stat test: file does not exist
我尝试了命令 COPY D:/test to /root/test
和 COPY ./test to /root/test
我知道发生此错误是因为我从中复制的路径必须与构建上下文相关(docker 构建中的 .)。它不能是构建上下文之外的系统上的任意路径。
我想通过使用 .
我会在我的构建上下文 D:\Programs>
的上下文 D:\
中,但我想不是。我的 COPY 命令应该是什么样的?
我已经检查过这里了:
更新 1
我将 test
文件夹放在 D:\Programs
中,我的 Docker 文件也位于其中,所以我现在的结构是:
D:\Programs
\Test
Dockerfile
然后我再次 运行 构建命令,我尝试了 COPY test to /root/test
和 COPY ./test to /root/test
,但都失败并出现上述相同的错误。
我知道如何做到这一点的唯一方法是在构建过程中更改 docker 文件位置,将复制的文件夹保持在上下文中。
如下:
'test' 文件夹位于 D:/test
设置docker文件复制命令为:
COPY test /root/test
假设 docker 文件位于 D:/Programs/dockerfile
在 CLI 中导航到 D:/
docker build -f ./Programs/dockerfile .
.
将“test”文件夹保留在构建上下文中。据我所知,您不能使用 docker 构建进入父目录等,因此您想留在父文件夹中并向下进入 docker 文件。
如果您 运行 来自 D:\Programs
的 docker build ...
该文件夹是 docker 构建上下文。 Dockerfile 中使用的所有文件都必须存在。
d:\files
在d:\programs
外面,所以永远找不到。
您需要将files
内容复制到您运行命令所在的地方,您可以使用此复制行
COPY samplefile1.txt /root/test
我假设您只在 COPY D:/test to /root/test
中添加了 to
作为缩写,但我还是建议检查一下。
如果您真的需要 D:/Programs
中的内容并且不能将其移动到当前构建上下文中的文件夹,我认为有两个通用选项:
更改构建上下文 - 我建议将构建上下文设置为 D:/
并将 D:/
目录中除 Programs
之外的每个文件夹添加到.dockerignore
文件,然后您可以从 D:/
中某处的某个子目录引用 Dockerfile,并根据需要在构建时复制您的文件
在运行时创建绑定安装 - 您可以在运行时将 D:/Programs
目录映射到容器 (/my-programs
) 内的文件夹,然后将文件从该文件夹复制到/root/test
或者只使用绑定安装文件夹 (/my-programs
)
如果将来可以在构建时使用绑定安装,您可以在创建 docker 图像时使用第二个选项
我想将文件夹 D:\test
从主机 OS (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
从文件夹 D:\Programs> I 运行 命令 docker build . -t test
但是我得到错误:
COPY failed: file not found in build context or excluded by .dockerignore: stat test: file does not exist
我尝试了命令 COPY D:/test to /root/test
和 COPY ./test to /root/test
我知道发生此错误是因为我从中复制的路径必须与构建上下文相关(docker 构建中的 .)。它不能是构建上下文之外的系统上的任意路径。
我想通过使用 .
我会在我的构建上下文 D:\Programs>
的上下文 D:\
中,但我想不是。我的 COPY 命令应该是什么样的?
我已经检查过这里了:
更新 1
我将 test
文件夹放在 D:\Programs
中,我的 Docker 文件也位于其中,所以我现在的结构是:
D:\Programs
\Test
Dockerfile
然后我再次 运行 构建命令,我尝试了 COPY test to /root/test
和 COPY ./test to /root/test
,但都失败并出现上述相同的错误。
我知道如何做到这一点的唯一方法是在构建过程中更改 docker 文件位置,将复制的文件夹保持在上下文中。
如下:
'test' 文件夹位于
D:/test
设置docker文件复制命令为:
COPY test /root/test
假设 docker 文件位于
D:/Programs/dockerfile
在 CLI 中导航到
D:/
docker build -f ./Programs/dockerfile .
.
将“test”文件夹保留在构建上下文中。据我所知,您不能使用 docker 构建进入父目录等,因此您想留在父文件夹中并向下进入 docker 文件。
如果您 运行 来自 D:\Programs
的 docker build ...
该文件夹是 docker 构建上下文。 Dockerfile 中使用的所有文件都必须存在。
d:\files
在d:\programs
外面,所以永远找不到。
您需要将files
内容复制到您运行命令所在的地方,您可以使用此复制行
COPY samplefile1.txt /root/test
我假设您只在 COPY D:/test to /root/test
中添加了 to
作为缩写,但我还是建议检查一下。
如果您真的需要 D:/Programs
中的内容并且不能将其移动到当前构建上下文中的文件夹,我认为有两个通用选项:
更改构建上下文 - 我建议将构建上下文设置为
D:/
并将D:/
目录中除Programs
之外的每个文件夹添加到.dockerignore
文件,然后您可以从D:/
中某处的某个子目录引用 Dockerfile,并根据需要在构建时复制您的文件在运行时创建绑定安装 - 您可以在运行时将
D:/Programs
目录映射到容器 (/my-programs
) 内的文件夹,然后将文件从该文件夹复制到/root/test
或者只使用绑定安装文件夹 (/my-programs
)
如果将来可以在构建时使用绑定安装,您可以在创建 docker 图像时使用第二个选项