小能豆

Docker build 本地出现问题

javascript

我创建了一个简单的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

可以随意修改/tmp/hosts了,为了访问nuget服务器,因为有DNS

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”]


阅读 45

收藏
2024-06-22

共1个答案

小能豆

问题出在 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"]

解释和改进

  1. 安装 Newtonsoft.Json
  2. build 阶段中添加了 RUN dotnet add package Newtonsoft.Json 命令,用于在 Docker 构建过程中安装 Newtonsoft.Json 包。这样可以确保在 Docker 镜像中包含了项目所需的依赖项。

  3. 构建阶段的顺序

  4. 保持了原始的构建流程,首先进行 restore、build 和 publish。然后在 final 阶段将发布的内容复制到最终的运行镜像中。

  5. 其他修改

  6. 对 hosts 文件进行了修改以允许访问 NuGet 服务器,这对于下载依赖项非常重要,特别是在受限的网络环境中。

注意事项

  • 依赖管理:确保在 Dockerfile 中包含了所有项目依赖的安装步骤,以免在构建或运行时出现缺失依赖的问题。
  • 镜像构建速度:在 Dockerfile 中可以根据需要优化构建步骤,例如尽可能缓存依赖项安装,以加快后续的构建过程。

通过以上修正后的 Dockerfile,你应该能够顺利地构建包含 Newtonsoft.Json 的 .NET Core Web 应用程序镜像,并且在运行时能够正常使用它。

2024-06-22