如何通过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 数组中写入内容。将 WORKDIR
或 COPY
命令括在单引号中未记录为有效。 string-form RUN
或 CMD
是一个明显的例外,但这只是因为这些命令是 运行 通过 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文件夹应该是我的背景的一部分。
我们有一个解决方案范围的文件夹,其中包含每个项目需要的共享设置。
我正在尝试将该文件夹的内容复制到 /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 数组中写入内容。将 WORKDIR
或 COPY
命令括在单引号中未记录为有效。 string-form RUN
或 CMD
是一个明显的例外,但这只是因为这些命令是 运行 通过 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 specifiedPATH
orURL
. The build process can refer to any of the files in the context. For example, your build can use aCOPY
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文件夹应该是我的背景的一部分。