多Dotnet应用关联Core类库时的Dockerfile构建方案咨询
问题描述
项目结构
solution-folder/ app1/ - app1.csproj - dockerfile - other files app2/ - app2.csproj - dockerfile - other files app3/ - app3.csproj - dockerfile - other files core/ - core.csproj - other files
应用Dockerfile内容
每个app下的Dockerfile初始内容:
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS core-build WORKDIR /src/app/core COPY ["../core/core.csproj", "/"]
构建报错
执行构建时出现如下错误:
3 | WORKDIR /src/app/core 4 | 5 | >>> COPY ["../core/core.csproj", "/"] ------------------------------------ ERROR: "/core/core.csproj": `not found`
已知Docker构建上下文不允许通过../访问上级目录,考虑将Dockerfile移到solution-folder根目录,但存在三个应用的Dockerfile,是否需要合并?如果不需要,如何生成三个不同应用的镜像?
解决方案
不需要合并Dockerfile,以下两种方案均可解决问题:
方案一:将Dockerfile移至根目录,通过指定构建文件区分应用
- 将三个app的Dockerfile分别重命名为
Dockerfile.app1、Dockerfile.app2、Dockerfile.app3,放到solution-folder根目录下。 - 修改每个Dockerfile的路径配置(以
Dockerfile.app1为例),此时构建上下文为根目录,可直接引用相对根目录的路径:FROM mcr.microsoft.com/dotnet/sdk:6.0 AS core-build WORKDIR /src/core COPY ["core/core.csproj", "."] RUN dotnet restore COPY ["core/", "."] FROM mcr.microsoft.com/dotnet/sdk:6.0 AS app1-build WORKDIR /src/app1 COPY ["app1/app1.csproj", "."] RUN dotnet restore COPY ["app1/", "."] COPY --from=core-build /src/core /src/core RUN dotnet publish -c Release -o /app/publish FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base WORKDIR /app COPY --from=app1-build /app/publish . ENTRYPOINT ["dotnet", "app1.dll"] - 在
solution-folder根目录执行对应构建命令生成镜像:# 构建app1镜像 docker build -t app1-image -f Dockerfile.app1 . # 构建app2镜像 docker build -t app2-image -f Dockerfile.app2 . # 构建app3镜像 docker build -t app3-image -f Dockerfile.app3 .
方案二:保留Dockerfile原位置,指定根目录为构建上下文
- 不移动Dockerfile,执行构建时将上下文指定为
solution-folder根目录,通过-f参数指定对应app的Dockerfile路径。 - 修改每个app下Dockerfile的路径配置(以app1下的Dockerfile为例),适配根目录上下文:
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS core-build WORKDIR /src/core COPY ["core/core.csproj", "."] RUN dotnet restore COPY ["core/", "."] FROM mcr.microsoft.com/dotnet/sdk:6.0 AS app1-build WORKDIR /src/app1 COPY ["app1/app1.csproj", "."] RUN dotnet restore COPY ["app1/", "."] COPY --from=core-build /src/core /src/core RUN dotnet publish -c Release -o /app/publish FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base WORKDIR /app COPY --from=app1-build /app/publish . ENTRYPOINT ["dotnet", "app1.dll"] - 在
solution-folder根目录执行构建命令:# 构建app1镜像 docker build -t app1-image -f app1/Dockerfile . # 构建app2镜像 docker build -t app2-image -f app2/Dockerfile . # 构建app3镜像 docker build -t app3-image -f app3/Dockerfile .
核心说明
Docker构建上下文是执行docker build时指定的目录(命令末尾的.),只有上下文内的文件能被COPY指令访问。两种方案的核心都是让上下文包含core和目标app的所有文件,避免跨上下文的../路径引用。
内容的提问来源于stack exchange,提问作者Ali CAKIL
相关产品推荐
相关产品推荐

