Cloud Native Buildpacks Tutorial - 3.4. ┗ gcr.io/paketo-buildpacks/builder:full-cf Builderで.NET CoreアプリのOCIイメージを作成

gcr.io/paketo-buildpacks/builder:full-cfで.NET CoreのアプリケーションのOCIイメージを作成します。

BuilderとStackを予めpullしておいてください。

docker pull gcr.io/paketo-buildpacks/builder:full-cf
docker pull gcr.io/paketo-buildpacks/run:full-cnb-full

次のコマンドで"Hello World"アプリケーションを作成します。

mkdir hello-dotnet-core
cd hello-dotnet-core

cat <<'EOF' > Program.cs
using System;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;

namespace hello
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }
    
        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });
    }
}
EOF

cat <<'EOF' > Startup.cs
using System;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

namespace hello
{
    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
        }

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            app.UseRouting();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapGet("/", async context =>
                {
                    await context.Response.WriteAsync("Hello World!");
                });
            });
        }
    }
}
EOF

cat <<'EOF' > hello.csproj
<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <RootNamespace>hello</RootNamespace>
  </PropertyGroup>
</Project>
EOF

pack buildコマンドでイメージを作成します。

pack build making/pack-dotnet-core --no-pull --builder gcr.io/paketo-buildpacks/builder:full-cf

BuilderとStackを事前にpullしていない場合は--no-pullを外せば、ビルド時にBuilderとStackもpullしますが、ビルドが遅くなります。

次のようなログが出力されます。

===> DETECTING
[detector] 5 of 7 buildpacks participating
[detector] paketo-buildpacks/dotnet-core-runtime 0.0.135
[detector] paketo-buildpacks/dotnet-core-aspnet  0.0.128
[detector] paketo-buildpacks/dotnet-core-sdk     0.0.133
[detector] paketo-buildpacks/dotnet-core-build   0.0.70
[detector] paketo-buildpacks/dotnet-core-conf    0.0.122
===> ANALYZING
[analyzer] Previous image with name "index.docker.io/making/pack-dotnet-core:latest" not found
===> RESTORING
===> BUILDING
[builder] 
[builder] .NETCore Runtime Buildpack 0.0.135
[builder]    3.1.3: Contributing to layer
[builder]     Downloading from https://buildpacks.cloudfoundry.org/dependencies/dotnet-runtime/dotnet-runtime_3.1.3_linux_x64_any-stack_676e8b85.tar.xz
[builder]     Verifying checksum
[builder]     Expanding to /layers/paketo-buildpacks_dotnet-core-runtime/dotnet-runtime
[builder]     Writing DOTNET_ROOT to shared
[builder]     Writing RUNTIME_VERSION to build
[builder] 
[builder] ASPNetCore Buildpack 0.0.128
[builder]    3.1.3: Contributing to layer
[builder]     Downloading from https://buildpacks.cloudfoundry.org/dependencies/dotnet-aspnetcore/dotnet-aspnetcore_3.1.3_linux_x64_any-stack_c96379e0.tar.xz
[builder]     Verifying checksum
[builder]     Expanding to /layers/paketo-buildpacks_dotnet-core-aspnet/dotnet-aspnetcore
[builder]   ASPNetCore Buildpack 0.0.128: Contributing to layer
[builder]     Writing DOTNET_ROOT to shared
[builder] 
[builder] .NET SDK Buildpack 0.0.133
[builder]    3.1.201: Contributing to layer
[builder]     Downloading from https://buildpacks.cloudfoundry.org/dependencies/dotnet-sdk/dotnet-sdk_3.1.201_linux_x64_any-stack_1904ac7d.tar.xz
[builder]     Verifying checksum
[builder]     Expanding to /layers/paketo-buildpacks_dotnet-core-sdk/dotnet-sdk
[builder]     Writing SDK_LOCATION to build
[builder]   .NET SDK Buildpack 0.0.133: Contributing to layer
[builder]     Symlinking runtime libraries
[builder]     Moving dotnet driver from /layers/paketo-buildpacks_dotnet-core-sdk/dotnet-sdk
[builder]     Writing PATH to shared
[builder]     Writing DOTNET_ROOT to shared
[builder] 
[builder] .Net Build Buildpack 0.0.70
[builder]   : Contributing to layer
[builder]     Symlinking runtime libraries
[builder]     Moving dotnet driver from /layers/paketo-buildpacks_dotnet-core-sdk/driver-symlinks
[builder]     Symlinking the SDK from /layers/paketo-buildpacks_dotnet-core-sdk/dotnet-sdk
[builder]   : Contributing to layer
[builder]     Publishing source code
[builder] 
[builder] Welcome to .NET Core 3.1!
[builder] ---------------------
[builder] SDK Version: 3.1.201
[builder] 
[builder] Telemetry
[builder] ---------
[builder] The .NET Core tools collect usage data in order to help us improve your experience. The data is anonymous. It is collected by Microsoft and shared with the community. You can opt-out of telemetry by setting the DOTNET_CLI_TELEMETRY_OPTOUT environment variable to '1' or 'true' using your favorite shell.
[builder] 
[builder] Read more about .NET Core CLI Tools telemetry: https://aka.ms/dotnet-cli-telemetry
[builder] 
[builder] ----------------
[builder] Explore documentation: https://aka.ms/dotnet-docs
[builder] Report issues and find source on GitHub: https://github.com/dotnet/core
[builder] Find out what's new: https://aka.ms/dotnet-whats-new
[builder] Learn about the installed HTTPS developer cert: https://aka.ms/aspnet-core-https
[builder] Use 'dotnet --help' to see available commands or visit: https://aka.ms/dotnet-cli-docs
[builder] Write your first app: https://aka.ms/first-net-core-app
[builder] --------------------------------------------------------------------------------------
[builder] Microsoft (R) Build Engine version 16.5.0+d4cbfca49 for .NET Core
[builder] Copyright (C) Microsoft Corporation. All rights reserved.
[builder] 
[builder]   Restore completed in 137.78 ms for /workspace/hello.csproj.
[builder]   hello -> /workspace/bin/Release/netcoreapp3.1/ubuntu.18.04-x64/hello.dll
[builder]   hello -> /workspace/
[builder] 
[builder] .NET Core Conf Buildpack 0.0.122
[builder]   Process types:
[builder]     web: cd /workspace && ./hello --urls http://0.0.0.0:${PORT}
===> EXPORTING
[exporter] Adding layer 'launcher'
[exporter] Adding layer 'paketo-buildpacks/dotnet-core-runtime:dotnet-runtime'
[exporter] Adding layer 'paketo-buildpacks/dotnet-core-aspnet:aspnet-symlinks'
[exporter] Adding layer 'paketo-buildpacks/dotnet-core-aspnet:dotnet-aspnetcore'
[exporter] Adding layer 'paketo-buildpacks/dotnet-core-sdk:driver-symlinks'
[exporter] Adding 1/1 app layer(s)
[exporter] Adding layer 'config'
[exporter] *** Images (2880b7d0fafd):
[exporter]       index.docker.io/making/pack-dotnet-core:latest
[exporter] Adding cache layer 'paketo-buildpacks/dotnet-core-runtime:676e8b85b8474755e17eca5b1876d4741f62cb2ba4416128474f3107263fda5e'
[exporter] Adding cache layer 'paketo-buildpacks/dotnet-core-aspnet:c96379e0d05c14e5f790bc806e101dbe49879c7b3df52849493a5831d66f5977'
[exporter] Adding cache layer 'paketo-buildpacks/dotnet-core-sdk:1904ac7d51d4680c1a123500f67e5cac86ea960f26676abab9e17e56b125d17a'
Successfully built image making/pack-dotnet-core

pack build時に--publishオプションをつけると、Docker Registryでのpushを行います。事前にdocker loginが必要です。

作成したイメージをdocker runで起動します。

docker run --rm -e PORT=8080 -p 8080:8080 making/pack-dotnet-core

アプリケーションにアクセスします。

$ curl localhost:8080 -w '\n'
Hello World!

Docker Imageのサイズを確認します。

$ docker images | grep making/pack-dotnet-core
making/pack-dotnet-core              latest              2880b7d0fafd        40 years ago        1.15GB

使用されるBuildpackは同じですが、ベースイメージのサイズが大きいため、gcr.io/paketo-buildpacks/builder:baseでビルドした場合に比べてイメージサイズが大きいです。

pack inspect-imageでイメージを解析します。

$ pack inspect-image making/pack-dotnet-core
Inspecting image: making/pack-dotnet-core

REMOTE:
(not present)

LOCAL:

Stack: org.cloudfoundry.stacks.cflinuxfs3

Base Image:
  Reference: 30c2fe64f46f987d570fddf1a9400c0e0f58eebe790f95557b9387e5dcfb08a2
  Top Layer: sha256:70227f7df5ee235dae16d7b6ce4a23b03bb57cadd64a00740d590fb11bbae042

Run Images:
  gcr.io/paketo-buildpacks/run:full-cnb-cf

Buildpacks:
  ID                                           VERSION
  paketo-buildpacks/dotnet-core-runtime        0.0.135
  paketo-buildpacks/dotnet-core-aspnet         0.0.128
  paketo-buildpacks/dotnet-core-sdk            0.0.133
  paketo-buildpacks/dotnet-core-build          0.0.70
  paketo-buildpacks/dotnet-core-conf           0.0.122

Processes:
  TYPE                 SHELL        COMMAND                                                       ARGS
  web (default)        bash         cd /workspace && ./hello --urls http://0.0.0.0:${PORT}

.NET Core Buildpackの細かい設定は https://github.com/paketo-buildpacks/dotnet-core を確認してください。

おわったらDocker Imageを削除します。

docker rmi making/pack-dotnet-core