如何通过dockerfile将文件夹的内容复制到/app



我们有一个解决方案范围的文件夹,其中包含每个项目所需的共享设置。

我正试图将该文件夹的内容复制到/app文件夹,但不起作用

这是我的dockerfile配置的一部分:

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-alpine3.12 AS build
### this is where I'm trying to copy the contents of Shared Settings to /app
WORKDIR '/src/Shared Settings'
COPY '/src/Shared Settings' /app
### this is part of the rest of the docker file, which works fine
WORKDIR /src
COPY . .
WORKDIR /src/OurProject.Server
RUN dotnet restore OurProject.Server.csproj
RUN dotnet build OurProject.Server.csproj -c Release -o /app

我需要更改什么才能将共享设置的内容复制到我的docker容器中的/app文件夹?

COPY指令的Dockerfile文档指出,它有两种形式,一种是空格分隔的形式,另一种是JSON数组形式,并指出

包含空白的路径需要后一种[JSON数组]形式。

因此,将其应用于您的特定路径,您将获得

COPY ["src/Shared Settings", "/app"]

这在Dockerfile中通常是正确的:在原生Dockerfile语法中唯一的引用就是在JSON数组中编写内容。将WORKDIRCOPY命令用单引号括起来并没有被证明有效果。字符串形式RUNCMD显然是一个例外,但这只是因为这些命令是通过shell运行的,并且在那里应用了shell的引用规则。

COPY '/src/Shared Settings' /app命令将失败,因为它是用于从构建上下文(包含Dockerfile的文件夹(进行复制的。但是,路径'/src/Shared Settings'表明您是从主机的根目录构建的。如果src目录不在根目录/,而是存在于不同的文件夹(例如/path/to/your/folder_containing_src_and_Dockerfile/src(中,则应将Dockerfile中的指令更改为:

COPY 'src/Shared Settings' /app

这将删除导致命令路径混乱的前导/

EDIT:如果你是从src目录构建的,只需在Dockerfile中使用以下指令:

COPY 'Shared Settings' /app

COPY指令与您将在其中构建此图像的上下文紧密链接。

这实际上是在文件中指出的:

docker build命令从Dockerfile和"context"构建Docker镜像。构建的上下文是位于指定的PATHURL中的一组文件。生成过程可以引用上下文中的任何文件。例如,您的构建可以使用COPY指令在上下文中引用文件。

来源:https://docs.docker.com/engine/reference/commandline/build/#extended-描述

这样说,尽管通常会这样做:

docker build .

你必须明白,当你忘记在某些情况下提供它时,你肯定看到Docker抱怨过的最后一个点.,就是这个构建将要发生的实际环境。

不过,您不必将.(即当前目录(作为上下文。

因此,您的目标是提供正确的上下文,该上下文将是/src/Shared Settings和Dockerfile所在文件夹之间的共同祖先文件夹。

您可能会遇到一个很大的缺点,文件夹Shared Settings只在src中,因为您将找到的唯一共同祖先可能会迫使您使用/作为上下文,从而使您成为一个庞大的上下文,因此构建非常繁重。

为了解决这个问题,您可以使用.dokerignore文件来忽略除您想要使用的文件夹之外的所有不相关的文件夹;即CCD_ 22和包含Dockerfile的文件夹。

此外,当你改变你的上下文时,请记住,你将不得不调整线

COPY . .

现在改为:

COPY name_of_the_folder_containing_the_Dockerfile .

以下是一个必须根据实际文件夹层次结构进行调整的示例。

这里的文件夹层次结构:

.
├── .dockerignore
└── src
├── docker
│   └── Dockerfile
└── shared_settings
└── foo.conf

Dockerfile中:

FROM alpine
COPY src/shared_settings /etc/opt/app
WORKDIR /opt/app
COPY src/docker .
## The new equivalent to your previous `COPY . .`
CMD ["ls","-l"]

以下是文件.dokerignore如何从上下文中排除与无关的文件夹

**
!src/docker
!src/shared_settings

现在,我可以进入src/docker文件夹,使用构建

docker build -f Dockerfile ../..

或者进入文件夹/并使用构建

docker build -f src/docker/Dockerfile .

唯一重要的是,包含Dockerfile的文件夹和shared_settings文件夹都应该是我的上下文的一部分。

相关内容

最新更新