使用 Cloud Native Build Packs/Paketo.io 和 spring-boot-maven-plugin 为 GitHub Container Registry link 配置自定义容器镜像 LABEL

Configure custom container image LABEL using Cloud Native Build Packs/Paketo.io with spring-boot-maven-plugin for GitHub Container Registry link

我使用 https://start.spring.io/ 创建了一个简单的 Spring 启动应用程序。现在我想使用 Paketo.io / Cloud Native Build Pack 对 spring-boot-maven-plugin 的支持来构建容器映像并使用 GitHub 操作将其推送到 GitHub Container Registry。

我的 pom.xml 看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.3</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>io.jonashackt</groupId>
    <artifactId>helloworld</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>helloworld</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>15</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

我在 GitHub 操作工作流程中使用 mvn spring-boot:build-image 命令成功地创建了一个 Docker 图像。我也成功了pushed it to the GitHub Container Registry (following this guide)。这是我的 build.yml 工作流程:

name: publish

on: [push]

jobs:
  publish:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2

    - name: Set up JDK 15
      uses: actions/setup-java@v1
      with:
        java-version: 15

    - name: Build the hello-world Docker image
      run: |
        echo 'Login to GitHub Container Registry'
        echo $CR_PAT | docker login ghcr.io -u jonashackt --password-stdin

        echo 'Build a container image from our Spring Boot app using Paketo.io / Cloud Native Build Packs'     
        mvn spring-boot:build-image --batch-mode --no-transfer-progress

        echo 'tag Paketo build image to have the right GitHub Container Registry coordinates'
        docker tag helloworld:0.0.1-SNAPSHOT ghcr.io/jonashackt/helloworld:latest
        
        docker push ghcr.io/jonashackt/helloworld:latest
      env:
        CR_PAT: ${{ secrets.CR_PAT }}

但 Container Registry 映像未链接到 GitHub 存储库。由于这必须在 Dockerfile:

中使用特定的 OCI 兼容 LABEL 来完成
LABEL org.opencontainers.image.source="https://github.com/jonashackt/helloworld"

如何将 Cloud Native Build Packs/Paketo 与 spring-boot-maven-plugin 一起配置此 LABEL

由于 spring-boot-maven-plugin 透明包装 Paketo.io / Cloud Native Build Packs,最好的方法是从 https://paketo.io/docs. There's a section on how to apply custom labels to application images:

开始

Paketo users may add labels to the application image using the Image Labels Buildpack.

由于 org.opencontainers.image.source 是 OCI 特定的标签,因此 the Image Labels Buildpack will set the correct label for us. All we have to do, is to pass an environment variable to the Paketo build that we prefix with BP_OCI_. Have a look at the possible OCI specific labels in the docs。例如,如果我们 运行 以下 Paketo 构建:

pack build spring-boot-buildpack
  --path . \
  --builder paketobuildpacks/builder:base \
  --env "BP_OCI_DESCRIPTION=Demo Application"

生成的应用程序图像将有一个 LABEL 定义值 org.opencontainers.image.description Demo Application。所以为了设置 org.opencontainers.image.source 我们需要为我们的 Paketo 构建定义环境变量 BP_OCI_SOURCE

但是当我们在这里使用 spring-boot-maven-plugin 时,我们需要以某种方式在我们的 pom.xml 中配置这个环境变量,因为我们不直接与 Paketo CLI 交互。 the documentation 告诉我们可以在 configuration 标签内使用 image.env 标签来定义

Environment variables that should be passed to the builder.

为了将特定于 OCI 的 LABEL org.opencontainers.image.source https://github.com/yourGitHubUserOrOrgaName/yourRepositoryName 配置到 Paketo 使用 spring-boot-maven-plugin 构建的应用程序映像,请将以下标签添加到您的 pom.xml (这里还有a fully comprehensible example project including a pom.xml):

<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <image>
                        <env>
                            <BP_OCI_SOURCE>https://github.com/yourGitHubUserOrOrgaName/yourRepositoryName</BP_OCI_SOURCE>
                        </env>
                    </image>
                </configuration>
            </plugin>
        </plugins>
    </build>

现在您的图像已链接到您的 GitHub 存储库。如果您查看帐户的包并单击构建映像,您应该会看到所有 README.md 信息映射如下: