构建ASP.NET 6 API Docker镜像时,WORKDIR /server报错:非目录
问题分析与解决方案
你的Docker构建失败的核心原因是:COPY单个文件时,目标路径/server不存在,Docker会将其创建为文件而非目录,后续执行WORKDIR /server时自然报错,因为/server是文件不是目录。
修正方案一:复制时指定目标为目录(加斜杠)
修改COPY命令,在目标路径末尾添加斜杠,明确告诉Docker要将文件复制到目录下,Docker会自动创建不存在的目录:
FROM mcr.microsoft.com/dotnet/sdk:6.0 as build WORKDIR /app # 目标路径末尾加/,确保Docker创建/server目录并将文件复制进去 COPY Tetris.Blazor/Server/Tetris.Blazor.Server.csproj /server/ WORKDIR /server RUN dotnet restore Tetris.Blazor.Server.csproj
修正方案二:提前创建目标目录
先通过RUN mkdir命令手动创建/server目录,再复制文件:
FROM mcr.microsoft.com/dotnet/sdk:6.0 as build WORKDIR /app # 提前创建/server目录 RUN mkdir -p /server COPY Tetris.Blazor/Server/Tetris.Blazor.Server.csproj /server/ WORKDIR /server RUN dotnet restore Tetris.Blazor.Server.csproj
更规范的DotNet容器构建写法(可选)
通常DotNet容器构建会保持项目目录结构,这样后续复制完整代码时更方便,示例如下:
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build WORKDIR /src # 保持项目目录结构复制csproj COPY Tetris.Blazor/Server/Tetris.Blazor.Server.csproj Tetris.Blazor/Server/ # 直接基于目录结构执行restore RUN dotnet restore Tetris.Blazor/Server/Tetris.Blazor.Server.csproj
内容的提问来源于stack exchange,提问作者jasper
相关产品推荐
相关产品推荐

