【问题标题】:Access a docker network during build of docker-compose v2?在构建 docker-compose v2 期间访问 docker 网络?
【发布时间】:2020-01-22 14:58:53
【问题描述】:

总结

有一个docker-compose.yml 文件可以构建这样的图像:

services:
  my-service:
    build: 
      context: My.VS.AppFolder
    networks:
      - my-docker

networks:
  my-docker:
    external: true

定义的网络仅在ENTRYPOINT 中可用。但不是在构建期间。在构建Dockerfile 期间,如何访问同一网络my-docker 上的另一个容器?

用例:从私有仓库获取 NuGet 包

用例说明

我有一个 ASP.NET Core MVC 2.1 Web 应用程序。为了更好地分离关注点,我想在另一个分离的 Web 应用程序(例如管理界面)中实现某些功能。为了避免复制应用程序布局 (Razor) 或一些辅助实用程序类等共享内容,我为这些内容创建了一个共享项目。

所以现在有三个项目:

  • MyApp (原始应用程序)
  • MyApp.Core (用于共享的东西)
  • MyApp.Admin

由于 MyApp.Core 需要从其他项目中引用,我为我的 docker 构建环境安装了 BaGet as simple NuGet hosting repo。此容器在nuget.config 中使用其DNS 名称在内部引用,在MyApp 的解决方案级别创建(在新的MyApp.Admin 上相同,但为了简单起见,让我们关注MyApp)。

问题

MyAppDockerfile 中,我现在正在这样做:

RUN dotnet restore --configfile nuget.config

并且需要访问my-docker 网络上名为baget 的dns 名称。 Researchs show that this is only possible with at least version 3.4 of docker-compose,似乎还没有正式记录。但是Docker removed several options from v2 in v3,例如我正在使用的mem_limits 等资源限制。从 v3 开始,它们仅可使用 swarm,不再适用于单个节点。

因此,除了迁移到 v3 和 swarm 之外,我目前没有看到任何解决方案,这会导致额外的工作和复杂性,除了这个网络问题之外没有其他好处。我的项目并不需要swarm那么大。

【问题讨论】:

    标签: c# docker asp.net-core docker-compose nuget


    【解决方案1】:

    我找到了解决这个问题的两种方法:

    使用docker cli 工具而不是docker-compose 构建

    我使用 dockers CLI 工具手动构建映像而不是 docker-compose up -d --build,因为它有一个 --network 开关,允许在构建期间指定网络:

    docker build --network my-docker -t my-service:latest --build-arg ASPNETCORE_ENVIRONMENT=Development My.VS.AppFolder
    

    现在在docker-compose.yml 中引用此图像,而不是在那里构建它:

    services:
      my-service:
        image: my-service:latest
    

    构建映像后,运行 docker-compose up -d 而不使用 --build 标志。这会导致一些开销,因为您必须进行 CLI 调用,并且对于像 alpine-3.2.1 这样的真正标记,需要使用 env 变量指定此标记并传递给 docker/docker-compose。但它似乎是生产使用的最佳替代方案。

    兼容模式

    --compatibility switch in docker-compose since 1.20.0 允许使用新的 v3 文件版本,但将资源限制等 swarm 选项映射到本地 v2 表单。换句话说:您可以在 v3 中使用指定的ressources,并且在使用此开关时它们适用于docker-compose。否则,它们将在docker-compose 上被忽略,并且仅对docker stack deploy 有效。

    因此,使用此开关,您可以在构建期间定义网络的能力中受益,而不会失去资源限制。 但是文档警告说,这对于生产性使用来说不够稳定:

    我们建议不要在生产环境中使用 --compatibility 模式。由于生成的配置只是使用非 Swarm 模式属性的近似值,因此可能会产生意想不到的结果。

    出于这个原因,我不认为它是一个真正的解决方案,而是使用第一种使用 dockers CLI 构建映像的方法,其中可以指定网络。

    【讨论】:

      猜你喜欢
      • 2019-11-14
      • 1970-01-01
      • 1970-01-01
      • 2018-05-07
      • 1970-01-01
      • 2019-07-10
      • 1970-01-01
      • 1970-01-01
      • 2020-08-09
      相关资源
      最近更新 更多