ASP.NET Core Web API Dockerfile无/src目录问题排查求助
问题排查:Docker构建ASP.NET Core Web API后程序未更新且/src目录缺失
问题背景
使用以下Dockerfile构建ASP.NET Core Web API项目,执行docker-compose up后程序始终是旧版本,同时发现容器里没有/src目录,怀疑这导致项目可执行文件没被正确复制。
容器内目录结构:
用到的Dockerfile
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base WORKDIR /app EXPOSE 80 EXPOSE 443 FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build WORKDIR /src COPY ["WebApplication1.csproj", "WebApplication1/"] RUN dotnet restore "WebApplication1/WebApplication1.csproj" WORKDIR "/src/WebApplication1" COPY . ./ RUN dotnet build "WebApplication1.csproj" -c Release -o /app/build FROM build AS publish RUN dotnet publish "WebApplication1.csproj" -c Release -o /app/publish /p:UseAppHost=false FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "WebApplication1.dll"]
问题分析与解决
1. /src目录不存在是正常情况
你使用了Docker多阶段构建,build、publish阶段的文件不会自动带入最终的final镜像——最终运行的容器基于base阶段构建,WORKDIR是/app,只包含从publish阶段复制过来的/app/publish内容,所以/src目录本就不该出现在运行容器里,这不是程序未更新的原因。
2. 程序停留在旧版本的核心问题
(1)Docker缓存未刷新
Docker会缓存构建的每一层,如果代码没触发缓存失效,会直接复用旧镜像。
- 解决:执行
docker-compose build --no-cache强制跳过缓存,重新构建所有层;或者用docker-compose up --build,让Compose先构建再启动容器。
(2)代码复制路径可能有误
检查执行构建命令的目录是否是项目根目录(即包含WebApplication1.csproj的文件夹)。你在build阶段切换到/src/WebApplication1后执行COPY . ./,如果构建命令不在正确的目录,复制的代码可能不是最新的。
- 解决:确保在项目根目录下运行
docker-compose命令,或者调整COPY的路径为正确的相对路径。
(3)镜像未重新构建
docker-compose up默认复用已有的镜像,不会自动重新构建。
- 解决:每次更新代码后,用
docker-compose up --build替换docker-compose up,确保基于最新代码构建镜像。
验证步骤
- 用
docker images查看镜像的创建时间,确认是否是最新构建的。 - 进入容器检查
/app目录内容:docker exec -it <容器ID> ls -la /app,核对文件修改时间和内容是否为最新版本。
内容的提问来源于stack exchange,提问作者Usman
相关产品推荐
相关产品推荐

