我创建了一个简单的NET CORE Web 应用程序,然后把自动生成的Dockerfile 复制到了.sln文件的同级目录,然后执行了docker build -t test001 . , 镜像可以生成成功。
然后我引用了Newtonsoft,再在项目里引用了它。 using Newtonsoft.Json; using Newtonsoft.Json.Linq;
再执行了docker build -t test001,就报错了。 /src/WebApplication2/Controllers/HomeController.cs(3,7): error CS0246: The type or namespace name ‘Newtonsoft’ could not be found (are you missing a using directive or an assembly reference?) [/src/WebApplication2/WebApplication2.csproj]
请问大佬们这个是什么原因
我的Dockerfile
FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS base WORKDIR /app EXPOSE 80
FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build WORKDIR /src
RUN cp /etc/hosts /tmp/hosts RUN mkdir -p – /lib-override && cp /lib/x86_64-linux-gnu/libnss_files.so.2 /lib-override RUN sed -i ‘s:/etc/hosts:/tmp/hosts:g’ /lib-override/libnss_files.so.2 ENV LD_LIBRARY_PATH /lib-override
RUN echo “152.199.4.184 api.nuget.org” >> /tmp/hosts
COPY [“WebApplication2/WebApplication2.csproj”, “WebApplication2/”] RUN dotnet restore “WebApplication2/WebApplication2.csproj” COPY . . WORKDIR “/src/WebApplication2” RUN dotnet build “WebApplication2.csproj” -c Release -o /app/build
FROM build AS publish RUN dotnet publish “WebApplication2.csproj” -c Release -o /app/publish
FROM base AS final WORKDIR /app COPY –from=publish /app/publish . ENTRYPOINT [“dotnet”, “WebApplication2.dll”]
问题出在 Docker 构建过程中,当你引入了 Newtonsoft.Json 并使用了它,但在 Dockerfile 中的构建阶段并没有包含这部分依赖。因此,需要在 Dockerfile 中确保在构建阶段能够恰当地安装和使用 Newtonsoft.Json。
以下是修正后的 Dockerfile,添加了安装 Newtonsoft.Json 的步骤:
FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS base WORKDIR /app EXPOSE 80 FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build WORKDIR /src RUN cp /etc/hosts /tmp/hosts RUN mkdir -p -- /lib-override && cp /lib/x86_64-linux-gnu/libnss_files.so.2 /lib-override RUN sed -i 's:/etc/hosts:/tmp/hosts:g' /lib-override/libnss_files.so.2 ENV LD_LIBRARY_PATH /lib-override # 修改 hosts 文件以访问 nuget.org RUN echo "152.199.4.184 api.nuget.org" >> /tmp/hosts # 复制并恢复项目文件 COPY ["WebApplication2/WebApplication2.csproj", "WebApplication2/"] RUN dotnet restore "WebApplication2/WebApplication2.csproj" # 复制整个项目并构建 COPY . . WORKDIR "/src/WebApplication2" RUN dotnet build "WebApplication2.csproj" -c Release -o /app/build # 发布项目 FROM build AS publish RUN dotnet publish "WebApplication2.csproj" -c Release -o /app/publish # 最终的运行镜像 FROM base AS final WORKDIR /app COPY --from=publish /app/publish . # 安装 Newtonsoft.Json RUN dotnet add package Newtonsoft.Json ENTRYPOINT ["dotnet", "WebApplication2.dll"]
在 build 阶段中添加了 RUN dotnet add package Newtonsoft.Json 命令,用于在 Docker 构建过程中安装 Newtonsoft.Json 包。这样可以确保在 Docker 镜像中包含了项目所需的依赖项。
build
RUN dotnet add package Newtonsoft.Json
构建阶段的顺序:
保持了原始的构建流程,首先进行 restore、build 和 publish。然后在 final 阶段将发布的内容复制到最终的运行镜像中。
其他修改:
通过以上修正后的 Dockerfile,你应该能够顺利地构建包含 Newtonsoft.Json 的 .NET Core Web 应用程序镜像,并且在运行时能够正常使用它。