Max*_*Max 13 github docker asp.net-core github-actions
假设我们正在使用 GitHub Actions 来构建和发布我们应用程序的容器映像。我将在这里选择 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
Run Code Online (Sandbox Code Playgroud)
...有一个简单的 Dockerfile,如下所示:
FROM mcr.microsoft.com/dotnet/core/aspnet:latest
WORKDIR /app
COPY buildOutput /app
ENTRYPOINT ["dotnet", "MyTestApp.dll"]
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
... 而 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"]
Run Code Online (Sandbox Code Playgroud)
旁白:如果您不熟悉多阶段构建,请注意
FROM第二个 Dockerfile 中的两个语句。我们在第一个临时容器中构建,然后仅将构建输出复制到最终(运行时优化的)容器映像中。
请注意,官方 ASP.NET Core 文档中明确推荐了第二种方法。
权衡
我已经确认这两种方法都有效并生成了一个有效的容器映像。值得注意的是,使用两种方法构建对拉取请求“just work”™ 的检查:
现在离开这个具体的例子,这是我目前对每种方法的优点的总体看法:
问题
我是否准确地描述了这两种方法的优点?
在容器内和容器外构建是否还有其他方面值得一提,特别是在 GitHub Actions 中?
听起来你说得很好,我只是指出一些事情。
使用多阶段构建很棒(在内部构建),这实际上取决于您的用例。例如,如果构建步骤不太复杂,就像您的示例一样,那么使用多阶段就足够了,而且它还有将小图像作为工件的好处。
继续进行复杂的构建 - 假设您需要 -
所以这里我们有多个步骤,可能并行运行其中一些步骤,例如下载工件,可以减少构建时间。此外,如果您将构建拆分为步骤,您可以监控哪些步骤失败,并相应地发送通知。
把它们加起来 -
如果您有更多想法,请告诉我,这是一个很棒的话题
| 归档时间: |
|
| 查看次数: |
1401 次 |
| 最近记录: |