我们有一个解决方案范围的文件夹,其中包含每个项目所需的共享设置。
我正试图将该文件夹的内容复制到/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数组中编写内容。将WORKDIR
或COPY
命令用单引号括起来并没有被证明有效果。字符串形式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
这将删除导致命令路径混乱的前导/
。
EDIT:如果你是从src目录构建的,只需在Dockerfile中使用以下指令:
COPY 'Shared Settings' /app
COPY
指令与您将在其中构建此图像的上下文紧密链接。
这实际上是在文件中指出的:
docker build
命令从Dockerfile和"context"构建Docker镜像。构建的上下文是位于指定的PATH
或URL
中的一组文件。生成过程可以引用上下文中的任何文件。例如,您的构建可以使用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文件夹都应该是我的上下文的一部分。