【问题标题】:Can F# type provides be used with containerized (Docker) resources?F# 类型提供可以与容器化 (Docker) 资源一起使用吗?
【发布时间】:2018-05-24 17:52:18
【问题描述】:

我知道如何使用某些 F# 类型的提供程序,例如SQLProvider非Docker开发:#if DEBUG,连接本地数据库,否则连接生产数据库。或者,如果类型提供程序支持它(与 SQLProvider 一样),请在配置文件中指定连接字符串。然而,在这两种情况下,数据库在构建时都是可用的(因为它必须是)。

但是,我刚刚开始使用 Docker 容器,当数据库在运行时仅在另一个容器中可用时(例如,通过 docker-compose 创建的专用网络),我看不到如何使用类型提供程序。对于开发,虽然肯定不理想,但我可以通过在本地(Docker 外部)设置相同的数据库来解决这个问题,这样类型提供程序就可以获取模式。然而,在部署时,数据库需要可用,但我的理解是,虽然 docker-compose 将按依赖顺序启动容器,但实际上构建容器是完整的隔离。

有没有使用类型提供程序访问容器化数据库的好方法?

【问题讨论】:

    标签: docker f# docker-compose type-providers


    【解决方案1】:

    您可以使用多阶段 docker 构建。设置一个包含数据库的“构建” docker 映像,并传递您要使用的构建程序集。这是我们代码库中的简短示例。

    # BUILDER IMAGE (with DB in it)
    FROM microsoft/dotnet:2-sdk-jessie as builder
    
    RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
    
    RUN echo "deb http://download.mono-project.com/repo/debian jessie main" > /etc/apt/sources.list.d/mono-official.list
    
    RUN apt-get update && apt-get install -y \ 
        mono-devel
    
    ADD ./ /app
    WORKDIR /app
    
    RUN ./build.sh Publish
    
    # FINAL IMAGE
    FROM microsoft/dotnet:runtime
    
    COPY --from=builder /app/deploy/ app/
    
    WORKDIR ./app/
    CMD ["dotnet", "MY_AMAZING_APP.dll"]
    

    有些行可能不是必需的(它是相当古老的代码库),只是为了给你一些提示。重要的部分是COPY --from=builder。希望对您有所帮助。

    【讨论】:

    • 你确定这可以用于我描述的用途吗?数据库是否必须实际运行才能让类型提供程序连接到它? (我希望在多阶段构建期间不应该运行任何东西?)
    【解决方案2】:

    根据所讨论的类型提供程序,您还可以通过使用始终在本地可用的硬编码或文件示例来避免构建对另一个正在运行的系统的依赖。

    例如,对于 JSON 类型提供程序,您可以提供带有示例对象的文本文件,以确保即使无法访问远程 Web 服务也可以构建。

    使用 SQLProvider 应该可以以类似于这篇优秀文章的方式使用 ContextSchemaPath 参数:https://medium.com/real-world-fsharp/continuous-integration-with-type-providers-6ddf40ee31b3

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-06
      • 1970-01-01
      • 1970-01-01
      • 2011-04-21
      • 1970-01-01
      相关资源
      最近更新 更多