【问题标题】:Dockerfile "COPY" command confusionDockerfile“COPY”命令混淆
【发布时间】:2022-02-14 13:17:12
【问题描述】:

我的本​​地“src”文件夹中有 3 个 .NET6 项目,如下所示:

src/A

src/B

src/C

A:web api项目,有很多nuget依赖

B:类库,依赖于A

C:类库,依赖于A

(注意:当然,包括 .csproj 在内的项目相关文件都存在于本地项目文件夹中)

我的 Dockerfile 在项目文件夹 A 中。 我正在从“src”文件夹(即这是构建上下文)运行“docker build”命令,如下所示:

docker build -f A/Dockerfile -t myapiimage:v1 . 

以下代码部分来自我的 Dockerfile,我尝试在其中恢复 nuget 依赖项:

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ./A/*.csproj A/
RUN dotnet restore A/A.csproj

这很好用,我知道图像中的 .csproj 存储在 /src/A/A.csproj 中 我说的对吗?

我想知道 COPY 是否保留了正在构建的镜像中的源文件夹结构?

因为在下面 3 行之后:

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY *.csproj ./

这条线都不行:

RUN dotnet restore A/A.csproj

或,

RUN dotnet restore A.csproj

或,

RUN dotnet restore *A.csproj

或,

RUN dotnet restore src/A/A.csproj

那么,这个 .csproj 文件(所有 3 个项目的)存储在映像中的什么位置?

【问题讨论】:

    标签: docker asp.net-web-api dockerfile


    【解决方案1】:

    您的COPY *.csproj ./ 行不会复制任何内容,因为主机上的 src 目录中没有 .csproj 文件。

    我通常这样做的方式有点笨拙。首先我做

    COPY */*.csproj ./  
    

    将所有 .csproj 文件复制到映像中的工作目录中。然后我做

    RUN for file in $(ls *.csproj); do mkdir -p ${file%.*}/ && mv $file ${file%.*}/; done
    

    查看所有 .csproj 文件并为它们创建一个目录并将它们移动到该目录中。

    使用这种方法,您的 Dockerfile 将如下所示

    FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
    WORKDIR /src
    COPY */*.csproj ./  
    RUN for file in $(ls *.csproj); do mkdir -p ${file%.*}/ && mv $file ${file%.*}/; done
    RUN dotnet restore A/A.csproj
    

    【讨论】:

    • 当然,我的本地文件夹包含 .csproj 文件,这些是完整的项目文件夹,包含项目相关文件,包括 .csproj 文件。我现在在我的问题中编辑/添加了其他信息。尽管您提供了一些关于如何复制这些文件并在图像中为它们创建目录的提示,但这不是我问的问题。如果您在上面看到我的代码(如所示),我想了解在 COPY 操作后文件如何驻留在图像中。
    • 我的意思是它们不存在于图像中,因为您的 COPY 语句不会复制任何内容。如果您执行COPY . . 之类的操作,则构建上下文中的所有内容都会被复制并保留目录结构,
    • 好的,你现在解开了我的一些疑惑。但是为什么COPY . . 保留现有的目录结构,而不是COPY ./A/*.csproj A/,我的意思是在这种特定情况下.csproj 应该被复制到``` /src/A/ ``` 目录。然后为什么我的下一条语句RUN dotnet restore src/A/A.csproj 没有找到 .csproj 文件。
    • @Pankaj_Sen COPY ./A/*.csproj A/ 确实有效,并将 .csproj 文件放入 /src/A。可能有问题的是您在还原命令中缺少斜杠。应该是RUN dotnet restore /src/A/A.csproj。如果没有斜线,它将查找名为 /src/src/A/A.csproj 的文件,因为路径是相对于当前目录的,即 /src..
    • 我不知道它何时做什么的确切规则,但是当您将文件复制到目录时,主机结构不会被保留。复制目录时,结构会保留。 COPY . . 复制一个目录。 COPY *.csproj ./ 复制文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-06
    • 2019-07-23
    • 1970-01-01
    • 2021-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多