假设我们使用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核心文档中明确推荐了第二种方法。
权衡
我已经确认了这两种方法都能工作并产生一个工作容器映像。特别要注意的是,对拉请求的构建检查“只适用于”™的两种方法:
现在,离开这个具体的例子,下面是我目前对每种方法的优点的看法:
问题
>
我是否准确地描述了这两种方法的优点?
在容器内部构建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