我有一个.NET Core 2.0 web api,它运行在负载均衡器(也是一个docker容器)后面的Docker容器上。我想通过拥有多个容器来扩展web api,每个客户一个容器。考虑到这一点,我必须对配置进行更改以分离和抽象客户详细信息,以便我可以为每个客户设置应用程序设置。这样我就会appsettings.CustomerA.config
,appsettings.CustomerB.config
等。
我的一般Dockerfile是:
FROM microsoft/aspnetcore-build AS builder
WORKDIR /app
# copy csproj and restore as distinct layers
COPY ./Project/*.csproj ./
RUN dotnet restore
# copy everything else and build
COPY ./Project ./
RUN dotnet publish -c Release -o out
# build runtime image
FROM microsoft/aspnetcore
WORKDIR /app
COPY --from=builder /app/out ./
ENV ASPNETCORE_ENVIRONMENT Production
ENTRYPOINT ["dotnet", "Project.dll"]
这一切都很好,但我不知道的是我是否可以使用不同的Dockerfiles,每个客户一个我指定客户(不确定这是否是一个好的做法,因为我会将环境与客户混合但是在同时,如果有意义的话,环境是针对特定客户的)或者我是否应该根据客户创建我复制的不同配置文件?
我从Microsoft docker文档https://docs.docker.com/engine/examples/dotnetcore/#create-a-dockerfile-for-an-aspnet-core-application中获取了docker模板并自行添加了环境。
感谢您的帮助
答案 0 :(得分:2)
不建议为每个客户提供单独的Dockerfile,甚至不要使用单独的图像。这将很快导致大量的dockerfiles被管理,并将引入许多复杂性,特别是当您想要在新功能需要时升级所有文件/图像时。
最好有一个Docker镜像,并将所有客户特定配置外部化到图像外部。
有多种方法可以做到这一点。在Docker中,您可以将环境变量传递给容器以进行配置。您还可以将环境变量包装在配置文件中,并将其作为env文件传递。
另一种“Docker方式”,用于外化图像外部的东西是使用bind mounts。您可以在运行容器时将主机中的目录绑定到容器上。在目录中,您可以拥有配置文件......容器可以在启动时获取。