当前位置: 首页 > 知识库问答 >
问题:

GitHub操作:构建外部容器还是内部容器?

谭景福
2023-03-14

假设我们使用GitHub操作构建并发布应用程序的容器映像。我将选择ASP.NET Core作为应用程序的技术堆栈,尽管这不太重要。

我想讨论两种不同的方法:

1.“外部构建”:在GitHub Actions runner中构建/编译应用程序,将输出复制到容器映像中

例如,我们的GitHub操作工作流文件可能如下所示...

name: build-outside
on: [push]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - name: Checkout repo
      uses: actions/checkout@v2
    - name: Setup .NET Core
      uses: actions/setup-dotnet@v1
    - name: .NET Publish
      run: dotnet publish --configuration Release --nologo -p:CI=true -o $GITHUB_WORKSPACE/buildOutput src
    - name: Build and push Docker image
      uses: docker/build-push-action@v1
      with:
        username: ${{ secrets.DOCKERHUB_USERNAME }}
        password: ${{ secrets.DOCKERHUB_ACCESS_TOKEN }}
        repository: ${{ format('{0}/build-outside-test', secrets.DOCKERHUB_USERNAME) }}
        tags: latest

...有一个简单的Dockerfile像这样:

FROM mcr.microsoft.com/dotnet/core/aspnet:latest
WORKDIR /app
COPY buildOutput /app
ENTRYPOINT ["dotnet", "MyTestApp.dll"]

2.“内置”:内置一个容器,将输出复制到另一个容器映像

在这种情况下,工作流文件较短...

name: build-inside
on: [push]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - name: Checkout repo
      uses: actions/checkout@v2
    - name: Build and push Docker image
      uses: docker/build-push-action@v1
      with:
        dockerfile: Dockerfile_build_inside
        username: ${{ secrets.DOCKERHUB_USERNAME }}
        password: ${{ secrets.DOCKERHUB_ACCESS_TOKEN }}
        repository: ${{ format('{0}/build-inside-test', secrets.DOCKERHUB_USERNAME) }}
        tags: latest

...而Dockerfile较长,因为现在我们正在构建应用程序本身和最终容器映像:

FROM mcr.microsoft.com/dotnet/core/sdk:latest AS build
WORKDIR /src
COPY src /src
RUN dotnet publish --configuration Release --nologo -p:CI=true -o ./buildOutput

FROM mcr.microsoft.com/dotnet/core/aspnet:latest AS runtime
WORKDIR /app
COPY --from=build /src/buildOutput ./
ENTRYPOINT ["dotnet", "MyTestApp.dll"]

旁白:如果您不熟悉多阶段构建,请注意第二个DockerFile中的两个from语句。我们正在构建第一个临时容器,然后只将构建输出复制到最终的(运行时优化的)容器映像中。

请注意,官方ASP.NET核心文档中明确推荐了第二种方法。

权衡

我已经确认了这两种方法都能工作并产生一个工作容器映像。特别要注意的是,对拉请求的构建检查“只适用于”™的两种方法:

现在,离开这个具体的例子,下面是我目前对每种方法的优点的看法:

  1. 外部生成:
  • 生成可以利用市场操作
  • 如果构建是复杂的并且包含多个步骤,那么使用GitHub操作原语(即一系列作业/任务)来设置它可能是有益的。这样,我们就可以让GH来优化构建、根据需要分配额外的资源、并行运行作业等。
  • 更容易检查生成失败(UI将准确显示哪一步失败)
  • 构建期间不需要下载第二个容器映像,因此可能会节省一点网络带宽
  • 精确、确定的生成输出
  • 对生成环境的完全控制;独立于生成运行程序
  • 容器生成也可以在本地开发计算机上运行,产生相同的精确输出

问题

>

  • 我是否准确地描述了这两种方法的优点?

    在容器内部构建vs外部,特别是在GitHub动作中,有没有其他方面值得一提的?

  • 暂时还没有答案

     类似资料:
    • 外部访问容器 容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P 或 -p 参数来指定端口映射。 当使用 -P 标记时,Docker 会随机映射一个 49000~49900 的端口到内部容器开放的网络端口。 使用 docker container ls 可以看到,本地主机的 49155 被映射到了容器的 5000 端口。此时访问本机的 49155 端口即可访问容器内 web 应

    • 直到今天,我才知道java有堆,堆是由JVM创建的。此外,这个内存是由操作系统分配给JVM实例的,即堆驻留在JVM实例中。 这表明,JVM和堆相距甚远。 所以,我现在很困惑,有谁能让我知道,我以前是错的还是我不能理解这幅画?

    • {% tabs first=”SDK 1.1.3 及以上版本”, second=”SDK 1.1.3 以下版本” %} {% content “first” %} SDK 1.1.3 及以上版本 以下操作都需指明操作的内容库,方法如下: let MyContentGroup = new wx.BaaS.ContentGroup(contentGroupID) 参数说明 参数 类型 必填 说明 co

    • 4.3.1.4 创建/使用内部内容供应器 内部内容供应器禁止除内部应用以外的应用使用。 下面展示了如何实现内部内容供应器的示例代码。 要点(创建内容供应器): 定义内部签名权限。 需要内部签名权限。 将导出属性显式设置为true。 验证内部签名权限是否由内部应用定义。 验证参数的安全性,即使这是来自内部应用的请求。 由于请求应用是内部的,因此可以返回敏感信息。 导出 APK 时,请使用与请求应用相

    • 问题内容: 我有一个div元素,并且在该div中,我们在p元素之间有文本。 我想添加一个标题。它应该放在p的内部还是外部? 哪个更好: 要么 问题答案: 无法将heading元素放置在HTML标记的元素内,不仅是形式上的,而且因为浏览器在遇到标题时会隐式终止一个打开的元素。所以这个问题是没有意义的:一个在特定上下文中不存在的元素在那个上下文中不能有任何意义(语义)。 您可以使用元素,也可以使用HT

    • 本文档介绍了内容的获取(包括内容表的自定义字段)和内容的创建、编辑和删除等操作 获取内容详情 接口 GET https://cloud.minapp.com/userve/v1/content/:content_group_id/text/:text_id/ 其中 content_group_id 是内容库的 ID, text_id 是内容的 ID 代码示例 var axios = require