【问题标题】:.net core docker image with app settings per customer.net core docker 镜像,每个客户都有应用程序设置
【发布时间】:2017-11-27 10:49:13
【问题描述】:

我有一个 .NET Core 2.0 Web api,它在负载均衡器(也是 docker 容器)后面的 Docker 容器上运行。我想通过拥有多个容器(每个客户一个)来扩展 Web api。考虑到这一点,我必须更改配置以分离和抽象客户详细信息,以便我可以为每个客户设置应用程序。这样我就会有appsettings.CustomerA.configappsettings.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"]

这一切都很好,但我不知道我是否可以有不同的 Dockerfile,每个客户一个我指定客户的位置(不确定这是否是一种好的做法,因为我会将环境与客户混合,但在同时,如果有意义的话,环境是针对给定客户的)或者我是否应该根据客户创建一个不同的配置文件来复制?

我从 Microsoft docker 文档https://docs.docker.com/engine/examples/dotnetcore/#create-a-dockerfile-for-an-aspnet-core-application 中获取了 docker 模板并自己添加了环境。

感谢您的帮助

【问题讨论】:

    标签: docker asp.net-core dockerfile


    【解决方案1】:

    不建议为每个客户使用单独的 Dockerfile,甚至不建议使用单独的镜像。这将很快导致需要管理大量 dockerfile 并引入许多复杂性,尤其是当您想要在新功能需要时升级所有文件/图像时。

    最好有一个 Docker 镜像并将所有客户特定的配置外部化到镜像之外。

    有多种方法可以做到这一点。在 Docker 中,您可以将环境变量传递给容器进行配置。您还可以将环境变量包装在配置文件中并将其作为 env 文件传递​​。

    另一种“Docker 方式”,将图像外部的内容外部化是使用bind mounts。运行容器时,您可以将主机中的目录绑定到容器上。在目录中,您可以拥有配置文件...容器可以在启动时获取。

    【讨论】:

    • 非常感谢。然后我将配置容器以使用挂载。似乎是实现我想要的最敏感的方式。如果我想使用 swarm,我想知道如何实现自动化。计划是在工作节点上部署容器,但如果选择使用挂载,我需要将客户配置单独部署到相关节点。我说的对吗?
    • 是的,这是真的。您需要在每台机器上进行配置。您可以通过一些网络共享(例如 NFS)来缓解此问题。或者,您可以切换到分布式的东西,例如 FTP 或键值存储,例如 Redis,每个容器根据环境变量请求其配置。
    • 我明白了,这也是一个很好的解决方案。非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2019-03-21
    • 1970-01-01
    • 1970-01-01
    • 2013-09-24
    • 2018-01-23
    • 2020-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多