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

How to copy contents of folder to /app via dockerfile?

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

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

这是我的 docker 文件配置的一部分:

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 文档指出它有两种形式,一种 space-separated 形式和一种 JSON-array 形式,并且指出

This latter [JSON array] form is required for paths containing whitespace.

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

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

这在 Dockerfile 中大体上是正确的:原生 Dockerfile 语法中唯一的引用是在 JSON 数组中写入内容。将 WORKDIRCOPY 命令括在单引号中未记录为有效。 string-form 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

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

编辑:如果您从 src 目录构建,只需在 Dockerfile 中使用以下指令:

COPY 'Shared Settings' /app

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

这实际上在文档中指出:

The docker build command builds Docker images from a Dockerfile and a “context”. A build’s context is the set of files located in the specified PATH or URL. The build process can refer to any of the files in the context. For example, your build can use a COPY instruction to reference a file in the context.

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

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

docker build .

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

您没有被迫将 . — 所以当前目录 — 作为您的上下文。

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

你最终可能会遇到一个很大的缺点,文件夹 Shared Settings 仅在 src 中,因为你会发现唯一的共同祖先可能会迫使你使用 / 作为你的背景,使你成为一个巨大的背景,因此非常沉重。

要解决这个问题,您可以使用 .dockerignore 文件,但忽略所有不相关的文件夹,但要使用的文件夹;即 /src/Shared Settings 和包含您的 Docker 文件 .

的文件夹

此外,当您更改上下文时,请注意您必须调整行

COPY . .

现在将改为:

COPY name_of_the_folder_containing_the_Dockerfile .

这是您必须根据实际文件夹层次结构进行调整的示例。

这里是文件夹层次结构:

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

Docker文件中:

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"]

以下是文件 .dockerignore 如何从上下文中排除文件夹 unrelated

**
!src/docker
!src/shared_settings

而且,现在我可以进入文件夹 src/docker 并构建:

docker build -f Dockerfile ../..

或者进入文件夹 / 并使用

构建
docker build -f src/docker/Dockerfile .

唯一重要的是包含Docker文件的文件夹和shared_settings文件夹应该是我的背景的一部分。