eclipse-hawkbit / hawkbit-extensions

Eclipse Public License 2.0
20 stars 30 forks source link

Hawkbit artifact s3 extension, what is the correct way of building a docker image with the extension to run it in Kubernetes? #110

Closed paltaa closed 2 months ago

paltaa commented 2 months ago

I've been trying for a few days to build hawkbit version 3.0.0M8 with the s3 artifacts extension, this is my Dockerfile:

# set Java
ARG JAVA_VERSION=17.0.11_9
# extracts spring layers from the app jar (to optimize boot)
FROM eclipse-temurin:${JAVA_VERSION}-jdk-alpine as build

ARG HAWKBIT_APP=hawkbit-update-server
ARG HAWKBIT_VERSION=pass_as_buils_arg

ENV BUILD_DIR=/opt/hawkbit_build
ENV APP=hawkbit-runtime
ENV VERSION=${HAWKBIT_VERSION}

RUN mkdir -p ${BUILD_DIR}/app
RUN apk add --no-cache --virtual build-dependencies gnupg unzip libressl wget git maven

ARG MARIADB_DRIVER_VERSION=2.7.8
#COPY KEY-mysql .
#RUN gpg --import KEY-mysql
RUN wget -O ${BUILD_DIR}/mariadb-java-client-${MARIADB_DRIVER_VERSION}.jar --no-verbose https://downloads.mariadb.com/Connectors/java/connector-java-${MARIADB_DRIVER_VERSION}/mariadb-java-client-${MARIADB_DRIVER_VERSION}.jar 
RUN wget -O ${BUILD_DIR}/mariadb-java-client-${MARIADB_DRIVER_VERSION}.jar.asc --no-verbose https://downloads.mariadb.com/Connectors/java/connector-java-${MARIADB_DRIVER_VERSION}/mariadb-java-client-${MARIADB_DRIVER_VERSION}.jar.asc
#RUN gpg --verify --batch ${BUILD_DIR}/mariadb-java-client-${MARIADB_DRIVER_VERSION}.jar.asc ${BUILD_DIR}/mariadb-java-client-${MARIADB_DRIVER_VERSION}.jar
#RUN rm ${BUILD_DIR}/mariadb-java-client-${MARIADB_DRIVER_VERSION}.jar.asc /KEY-mysql

## Building hawkbit from source
RUN set -x &&\
    git clone https://github.com/eclipse/hawkbit.git /opt/hawkbit --branch  ${HAWKBIT_VERSION}

WORKDIR /opt/hawkbit 

## Copy modified pom.xml
COPY pom.xml .

RUN mvn versions:set -DnewVersion=${HAWKBIT_VERSION}
RUN mvn clean install -DskipTests --debug -Dspring.profiles.active=mysql  -Daws.region=us-east-1    
ENV HAWKBIT_JAR=/opt/hawkbit/hawkbit-runtime/hawkbit-update-server/target/hawkbit-update-server-0.3.0M8.jar
RUN java -Djarmode=layertools -jar ${HAWKBIT_JAR} extract --destination ${BUILD_DIR}

FROM eclipse-temurin:${JAVA_VERSION}-jre-alpine
ARG MARIADB_DRIVER_VERSION=2.7.8
ARG HAWKBIT_VERSION=pass_as_buils_arg
ENV HAWKBIT_JAR=/opt/hawkbit/hawkbit-runtime/hawkbit-update-server/target/hawkbit-update-server-0.3.0M8.jar
ENV VERSION=${HAWKBIT_VERSION}
RUN addgroup -S hawkbit_group && adduser -D hawkbit -G hawkbit_group
RUN mkdir -p /artifactrepo && chown -R hawkbit /artifactrepo
USER hawkbit
ENV BUILD_DIR=/opt/hawkbit_build
WORKDIR /opt/hawkbit
COPY --from=build /opt/hawkbit_build/mariadb-java-client-${MARIADB_DRIVER_VERSION}.jar ./BOOT-INF/lib/
COPY --from=build ${BUILD_DIR}/dependencies/ ./
COPY --from=build ${BUILD_DIR}/spring-boot-loader/ ./
COPY --from=build ${BUILD_DIR}/snapshot-dependencies/ ./
COPY --from=build ${BUILD_DIR}/application/ .

ARG CONTAINER_PORT=8080
ENV JAVA_OPTS="-Dspring.profiles.active=mysql -Xms768m -Xmx768m -XX:MaxMetaspaceSize=250m -XX:MetaspaceSize=250m -Xss300K -XX:+UseG1GC -XX:+UseStringDeduplication -XX:+UseCompressedOops -XX:+HeapDumpOnOutOfMemoryError"

VOLUME "/artifactrepo"
EXPOSE ${CONTAINER_PORT}
ENTRYPOINT ["sh", "-c", "java ${JAVA_OPTS} org.springframework.boot.loader.JarLauncher ${@}"]

Installing the Kubernets helm chart with the oficial eclipse-iot packages repo, these are the values:

# Copyright (c) 2019, 2021 Contributors to the Eclipse Foundation
#
# See the NOTICE file(s) distributed with this work for additional
# information regarding copyright ownership.
#
# This program and the accompanying materials are made available under the
# terms of the Eclipse Public License 2.0 which is available at
# http://www.eclipse.org/legal/epl-2.0
#
# SPDX-License-Identifier: EPL-2.0
---
# Default values for hawkbit.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.

image:
  repository: "mycustom repo"
  tag: 0.3.0M8
  pullPolicy: Always

replicaCount: 1

## podDisruptionBudget configuration
podDisruptionBudget:
  enabled: false
  minAvailable: 1

## Pod Security Context
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/
securityContext:
  enabled: true
  # 65534 is the uid of user nobody in the docker image
  fsGroup: 65534
  runAsUser: 65534
  extra: {}

## strategy used to replace old Pods by new ones
## ref: https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#strategy
updateStrategy:
  ## default is re-create, because of possible database migrations
  type: Recreate

nameOverride: ""
fullnameOverride: ""

service:
  type: ClusterIP
  port: 80
  annotations: {}
    # traefik.ingress.kubernetes.io/affinity: "true"

livenessProbe:
  initialDelaySeconds: 240
  timeoutSeconds: 5
readinessProbe:
  initialDelaySeconds: 120
  timeoutSeconds: 5

ingress:
  enabled: false
  annotations:
    nginx.ingress.kubernetes.io/proxy-body-size: 8m
    # ingress.kubernetes.io/ssl-redirect: "true"
    # kubernetes.io/tls-acme: "true"
  hosts:
    - host: hawkbit.lighthouse.harbor.systems
      paths: []
  tls: []
  #  - secretName: hawkbit-tls
  #    hosts:
  #      - hawkbit.local

routes:
  enabled: false
  tls: true

# enable local file storage
fileStorage:
  enabled: false
  pvcSize: "30Gi"
  mountPath: "/var/lib/hawkbit-storage"

# env vars for configuration
env:
  springDatasourceHost: "hawkbit-mysql"
  springDatasourceDb: "hawkbit"
  springRabbitmqHost: "hawkbit-rabbitmq"
  springRabbitmqUsername: "hawkbit"
  springRabbitmqPassword: "hawkbit"

# optional env vars
extraEnv: #{}
  org.eclipse.hawkbit.artifact.repository.s3.bucketName: <redacted>
  AWS_ACCESS_KEY_ID:  <redacted>
  AWS_SECRET_ACCESS_KEY: <redacted>
  AWS_REGION: us-east-1
  org.eclipse.hawkbit.artifact.repository.s3.enabled: true
  JAVA_OPTS: "-Xdebug"
  LOGGING_LEVEL_ROOT: DEBUG

resources: {}

nodeSelector: {}

tolerations: []

affinity: {}

podTemplate:
  annotations: {}

extraVolumes: []
extraVolumeMounts: []

configMap:
  mountPath: "/opt/hawkbit/config"

spring:
  profiles: "mysql"

config:
  application:
    hawkbit:
      multipart:
        maxFileSize: "1073741824"
        maxRequestSize: "1073741824"
      server:
        useForwardHeaders: true
        security:
          dos:
            maxArtifactSize: "1073741824"
            maxArtifactStorage: "10737418240"
      #     oidc-client-id: "[KEYCLOAK_DEVICE_REGISTRY_CLIENT_ID]"
    spring:
      servlet:
        multipart:
          enabled: "true"
          max-file-size: "1073741824"
          max-request-size: "1073741824"
  cloud:
    stream:
      bindings:
        default:
          group: "hawkbit"
        device-created:
          destination: "device-registry.device-created"
        device-updated:
          destination: "device-registry.device-updated"
        device-deleted:
          destination: "device-registry.device-deleted"
  security:
    user:
      name: admin
  secrets:
      hawkbit:
        artifact:
          url:
            protocols:
              download-http:
                protocol: https
                port: 443
        dmf:
          hono:
            password: "[KEYCLOAK_HAWKBIT_USER_PASSWORD]"
        server:
          ddi:
            security:
              authentication: 
                anonymous:
                  enabled: "false"
          forward-headers-strategy: NATIVE
          security:
            dos:
              maxArtifactSize: "42949672960"
              maxArtifactStorage: "42949672960"
      spring:
        http:
          multipart:
            max-file-size: "42949672960"
        servlet:
          multipart:
            max-file-size: "42949672960"
            max-request-size: "42949672960"
        security:
          user:
            # the "{noop}" prefix is needed!
            password: "{noop}<redacted>"
        datasource:
          username: hawkbit
          password: hawkbit

## dependency charts config
## ref: https://github.com/bitnami/charts/blob/master/bitnami/mysql/values.yaml
mysql:
  enabled: true
  primary:
    persistence:
      enabled: true
    resources: {}
  volumePermissions:
    enabled: true
  architecture: standalone
  auth:
    username: hawkbit
    password: hawkbit
    database: hawkbit
    rootPassword: <redaxted>
  metrics:
    enabled: true

## ref: https://github.com/bitnami/charts/blob/master/bitnami/rabbitmq/values.yaml
rabbitmq:
  enabled: true
  persistence:
    enabled: true
  volumePermissions:
    enabled: true
  auth:
    username: hawkbit
    password: <redacted>
  metrics:
    enabled: true

And finally the custom pom file where i added the s3 dependencies but when i run it it seems that its just not there and im getting errors trying to upload files after disabling fileStorage:

<!--

    Copyright (c) 2015 Bosch Software Innovations GmbH and others.

    All rights reserved. This program and the accompanying materials
    are made available under the terms of the Eclipse Public License v1.0
    which accompanies this distribution, and is available at
    http://www.eclipse.org/legal/epl-v10.html

-->
<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 http://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.7.10</version>
   </parent>

   <groupId>org.eclipse.hawkbit</groupId>
   <artifactId>hawkbit-parent</artifactId>
   <version>0.3.0-SNAPSHOT</version>
   <packaging>pom</packaging>
   <name>hawkBit :: Parent</name>

   <licenses>
      <license>
         <name>Eclipse Public License - Version 1.0</name>
         <url>http://www.eclipse.org/org/documents/epl-v10.php</url>
      </license>
   </licenses>

   <modules>
      <module>hawkbit-core</module>
      <module>hawkbit-security-core</module>
      <module>hawkbit-security-integration</module>
      <module>hawkbit-http-security</module>
      <module>hawkbit-repository</module>
      <module>hawkbit-artifact-repository-filesystem</module>
      <module>hawkbit-autoconfigure</module>
      <module>hawkbit-ui</module>
      <module>hawkbit-rest</module>
      <module>hawkbit-dmf</module>
      <module>hawkbit-test-report</module>
      <module>hawkbit-runtime</module>
      <module>hawkbit-starters</module>
   </modules>

   <scm>
      <connection>${release.scm.connection}</connection>
      <developerConnection>${release.scm.developerConnection}</developerConnection>
      <url>${release.scm.url}</url>
   </scm>

   <ciManagement>
      <system>Jenkins</system>
      <url>https://hudson.eclipse.org/hawkbit/</url>
   </ciManagement>

   <developers>
      <developer>
         <id>kaizimmerm</id>
         <email>kai.zimmermann@microsoft.com</email>
         <organization>Microsoft</organization>
         <organizationUrl>https://www.microsoft.com</organizationUrl>
         <roles>
            <role>Lead</role>
            <role>Committer</role>
         </roles>
      </developer>
      <developer>
         <id>laverman</id>
         <email>Jeroen.Laverman@bosch.io</email>
         <organization>Bosch.IO GmbH</organization>
         <organizationUrl>https://www.bosch.io</organizationUrl>
         <roles>
            <role>Lead</role>
            <role>Committer</role>
         </roles>
      </developer>
      <developer>
         <id>michahirsch</id>
         <roles>
            <role>Committer</role>
         </roles>
      </developer>
      <developer>
         <id>schabdo</id>
         <email>Dominic.Schabel@bosch.io</email>
         <organization>Bosch.IO GmbH</organization>
         <organizationUrl>https://www.bosch.io</organizationUrl>
         <roles>
            <role>Committer</role>
         </roles>
      </developer>
      <developer>
         <id>stefbehl</id>
         <email>Stefan.Behl@bosch.io</email>
         <organization>Bosch.IO GmbH</organization>
         <organizationUrl>https://www.bosch.io</organizationUrl>
         <roles>
            <role>Committer</role>
         </roles>
      </developer>
   </developers>

   <distributionManagement>
      <repository>
         <id>ossrh</id>
         <name>hawkBit Repository - Release</name>
         <url>https://oss.sonatype.org/service/local/staging/deploy/maven2</url>
      </repository>
      <snapshotRepository>
         <id>ossrh</id>
         <name>hawkBit Repository - Snapshots</name>
         <url>https://oss.sonatype.org/content/repositories/snapshots</url>
      </snapshotRepository>
   </distributionManagement>

   <repositories>
      <repository>
         <id>vaadin-addons</id>
         <url>https://maven.vaadin.com/vaadin-addons</url>
      </repository>
   </repositories>

   <properties>

      <java.version>11</java.version>

      <spring.boot.version>2.7.10</spring.boot.version>
      <spring-framework.version>5.3.26</spring-framework.version>
      <spring.cloud.version>2021.0.5</spring.cloud.version>
      <spring.plugin.core.version>2.0.0.RELEASE</spring.plugin.core.version>

      <snapshotDependencyAllowed>true</snapshotDependencyAllowed>

      <!-- Spring boot version overrides (should be reviewed with every boot
         upgrade) - START -->
      <!-- Newer versions needed than defined in Boot -->
      <!-- Fixed dependencies -->
      <!-- CVE-2022-25857 -->
      <snakeyaml.version>1.33</snakeyaml.version>
      <!-- maintain compatibility with AWS Aurora for production setups -->
      <mariadb.version>2.7.8</mariadb.version>
      <!-- CVE-2020-36518, CVE-2022-42003, CVE-2022-42004 -->
      <jackson-bom.version>2.14.2</jackson-bom.version>
      <!-- Spring boot version overrides - END -->

      <!-- CVE-2022-31690 -->
      <spring-security-oauth2-client.version>5.7.7</spring-security-oauth2-client.version>

      <rabbitmq.http-client.version>3.12.1</rabbitmq.http-client.version>

      <!-- Vaadin versions - START -->
      <!-- Vaadin version 8.14.3 is the last version running under an Apache 2.0 license -->
      <vaadin.version>8.14.3</vaadin.version>
      <vaadin.spring.version>3.2.1</vaadin.spring.version>
      <vaadin.spring.addon.version>2.0.0.RELEASE</vaadin.spring.addon.version>
      <vaadin.plugin.version>${vaadin.version}</vaadin.plugin.version>
      <vaadin.addon.dbar-addon.version>3.0.1</vaadin.addon.dbar-addon.version>
      <vaadin.gwt-api.version>1.3.0</vaadin.gwt-api.version>
      <vaadin.gwt-user.version>2.9.0</vaadin.gwt-user.version>
      <!-- Vaadin versions - END -->

      <!-- ************************ -->
      <!-- Maven Plugins -->
      <!-- ************************ -->
      <!-- Docker image build - START -->
      <docker.repository.name>${project.artifactId}</docker.repository.name>
      <docker.host>unix:///var/run/docker.sock</docker.host>
      <docker.maven.plugin.version>0.40.3</docker.maven.plugin.version>
      <docker.memory.size>-Xms600m -Xmx600m -XX:MaxMetaspaceSize=250m -XX:MetaspaceSize=250m -Xss300K
      </docker.memory.size>
      <docker.base.image.platform>linux/amd64</docker.base.image.platform>
      <docker.gc.settings>-XX:+UseG1GC -XX:+UseStringDeduplication -XX:+UseCompressedOops</docker.gc.settings>
      <docker.jvm.args>${docker.memory.size} ${docker.gc.settings} -XX:+HeapDumpOnOutOfMemoryError
         -XX:+ExitOnOutOfMemoryError -Djava.security.egd=file:/dev/./urandom
      </docker.jvm.args>
      <docker.jre.version>11.0.15_10-jre-alpine</docker.jre.version>
      <!-- Docker image build - END -->
      <maven.processor.plugin.version>3.3.3</maven.processor.plugin.version>
      <maven.scm.plugin.version>1.11.1</maven.scm.plugin.version>
      <maven.site.plugin.version>3.9.1</maven.site.plugin.version>
      <maven.surefire.plugin.version>3.0.0-M7</maven.surefire.plugin.version>
      <maven.failsafe.plugin.version>3.0.0-M7</maven.failsafe.plugin.version>
      <maven.enforcer.plugin.version>3.1.0</maven.enforcer.plugin.version>
      <!-- ************************ -->
      <!-- Maven Surefire settings -->
      <!-- ************************ -->
      <surefire.forkcount>1</surefire.forkcount>

      <!-- Misc libraries versions - START -->
      <cron-utils.version>9.1.6</cron-utils.version>
      <jsoup.version>1.15.3</jsoup.version>
      <allure.version>2.13.10</allure.version>
      <eclipselink.version>2.7.11</eclipselink.version>
      <eclipselink.maven.plugin.version>2.7.9.1</eclipselink.maven.plugin.version>
      <jaxb-api.version>2.3.1</jaxb-api.version>
      <gwtmockito.version>1.1.8</gwtmockito.version>
      <guava.version>30.1.1-jre</guava.version>
      <javax.el-api.version>2.2.4</javax.el-api.version>
      <corn-cps.version>1.1.7</corn-cps.version>
      <commons-io.version>2.11.0</commons-io.version>
      <rsql-parser.version>2.1.0</rsql-parser.version>
      <awaitility.version>3.1.2</awaitility.version>
      <io-protostuff.version>1.5.6</io-protostuff.version>

      <!-- SONATYPE-2021-1175 -->
      <logback.version>1.2.9</logback.version>
      <!-- Misc libraries versions - END -->

      <!-- Release - START -->
      <release.scm.connection>scm:git:git@github.com:eclipse/hawkbit.git</release.scm.connection>
      <release.scm.developerConnection>scm:git:https://github.com/eclipse/hawkbit.git</release.scm.developerConnection>
      <release.scm.url>https://github.com/eclipse/hawkbit.git</release.scm.url>
      <!-- Release - END -->

      <!-- Sonar - START -->
      <sonar.host.url>https://sonarcloud.io</sonar.host.url>
      <sonar.organization>bosch-iot-rollouts</sonar.organization>
      <sonar.projectKey>${project.groupId}:${project.artifactId}</sonar.projectKey>
      <sonar.branch.name>LOCAL_SCAN</sonar.branch.name>
      <sonar.qualitygate.wait>true</sonar.qualitygate.wait>
      <sonar.qualitygate.timeout>600</sonar.qualitygate.timeout>
      <sonar.links.homepage>https://www.eclipse.org/hawkbit</sonar.links.homepage>
      <sonar.links.ci>https://circleci.com/gh/eclipse/hawkbit</sonar.links.ci>
      <sonar.exclusions>
         **/target/generated-sources/apt/**,**/src/test/**,**/src/main/java/org/eclipse/hawkbit/repository/test/**
      </sonar.exclusions>
      <sonar.coverage.exclusions>
         **/src/main/java/org/eclipse/hawkbit/ui/**,**/target/generated-sources/apt/**,**/src/main/java/org/eclipse/hawkbit/repository/test/**,**/examples/**
      </sonar.coverage.exclusions>
      <jacoco.version>0.8.8</jacoco.version>
      <jacoco.outputDir>${project.build.directory}</jacoco.outputDir>
      <sonar.coverage.jacoco.xmlReportPaths>
         ${project.basedir}/../hawkbit-test-report/target/jacoco-aggregate/jacoco.xml,
         ${project.basedir}/../../hawkbit-test-report/target/jacoco-aggregate/jacoco.xml
      </sonar.coverage.jacoco.xmlReportPaths>
      <!-- Sonar - END -->
   </properties>

   <build>
      <plugins>
         <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
               <compilerArgument>-Xlint:all</compilerArgument>
               <showWarnings>true</showWarnings>
               <showDeprecation>true</showDeprecation>
            </configuration>
         </plugin>
         <plugin>
            <groupId>com.mycila</groupId>
            <artifactId>license-maven-plugin</artifactId>
         </plugin>
         <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-enforcer-plugin</artifactId>
            <version>${maven.enforcer.plugin.version}</version>
            <executions>
               <execution>
                  <!-- Make sure that only non-snapshot versions are used
                     for the dependencies. Only active when property 'snapshotDependencyAllowed'
                     is false. -->
                  <id>enforce-no-snapshots</id>
                  <goals>
                     <goal>enforce</goal>
                  </goals>
                  <configuration>
                     <skip>${snapshotDependencyAllowed}</skip>
                     <rules>
                        <requireReleaseDeps>
                           <message>No Snapshots Allowed!</message>
                        </requireReleaseDeps>
                        <requireReleaseVersion>
                           <message>No Snapshots Allowed!</message>
                        </requireReleaseVersion>
                        <requireMavenVersion>
                           <version>3.5</version>
                        </requireMavenVersion>
                     </rules>
                  </configuration>
               </execution>
            </executions>
         </plugin>
         <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>versions-maven-plugin</artifactId>
         </plugin>
         <plugin>
            <artifactId>maven-scm-plugin</artifactId>
            <version>${maven.scm.plugin.version}</version>
            <configuration>
               <tag>${project.version}</tag>
            </configuration>
         </plugin>
         <plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <version>${jacoco.version}</version>
            <executions>
               <execution>
                  <id>prepare-ut-agent</id>
                  <phase>process-test-classes</phase>
                  <goals>
                     <goal>prepare-agent</goal>
                  </goals>
                  <configuration>
                     <propertyName>jacoco.agent.ut.arg</propertyName>
                  </configuration>
               </execution>
               <execution>
                  <id>prepare-it-agent</id>
                  <phase>pre-integration-test</phase>
                  <goals>
                     <goal>prepare-agent-integration</goal>
                  </goals>
                  <configuration>
                     <propertyName>jacoco.agent.it.arg</propertyName>
                  </configuration>
               </execution>
            </executions>
         </plugin>
         <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-source-plugin</artifactId>
            <executions>
               <execution>
                  <id>attach-sources</id>
                  <goals>
                     <goal>jar</goal>
                  </goals>
               </execution>
            </executions>
         </plugin>
      </plugins>

      <pluginManagement>
         <plugins>
            <plugin>
               <groupId>io.fabric8</groupId>
               <artifactId>docker-maven-plugin</artifactId>
               <version>${docker.maven.plugin.version}</version>
               <configuration>
                  <verbose>true</verbose>
                  <dockerHost>${docker.host}</dockerHost>
                  <images>
                     <image>
                        <alias>${docker.repository.name}</alias>
                        <name>
                           ${docker.repository.name}:${project.version}
                        </name>
                        <build>
                           <from>eclipse-temurin:${docker.jre.version}</from>
                           <createImageOptions>
                              <platform>${docker.base.image.platform}</platform>
                           </createImageOptions>
                           <tags>
                              <tag>latest</tag>
                           </tags>
                           <env>
                              <SPRING_PROFILES_ACTIVE>docker</SPRING_PROFILES_ACTIVE>
                              <JAVA_OPTS>${docker.jvm.args}</JAVA_OPTS>
                           </env>
                           <ports>
                              <port>8080</port>
                           </ports>
                           <assembly>
                              <inline>
                                 <fileSets>
                                    <fileSet>
                                       <directory>target</directory>
                                       <outputDirectory>.</outputDirectory>
                                       <includes>
                                          <include>${project.build.finalName}.jar</include>
                                       </includes>
                                       <fileMode>0644</fileMode>
                                       <directoryMode>0755</directoryMode>
                                       <filtered>false</filtered>
                                    </fileSet>
                                 </fileSets>
                              </inline>
                           </assembly>
                           <entryPoint>
                              <shell>java $JAVA_OPTS -jar maven/${project.build.finalName}.jar</shell>
                           </entryPoint>
                        </build>
                     </image>
                  </images>
               </configuration>
               <executions>
                  <execution>
                     <phase>package</phase>
                     <goals>
                        <goal>remove</goal>
                        <goal>build</goal>
                     </goals>
                  </execution>
               </executions>
            </plugin>
            <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-javadoc-plugin</artifactId>
               <configuration>
                  <doclint>syntax</doclint>
               </configuration>
            </plugin>

            <plugin>
               <groupId>com.mycila</groupId>
               <artifactId>license-maven-plugin</artifactId>
               <version>2.11</version>
               <configuration>
                  <header>licenses/LICENSE_HEADER_TEMPLATE_BOSCH_23.txt</header>
                  <validHeaders>
                     <validHeader>licenses/LICENSE_HEADER_TEMPLATE_SIEMENS.txt</validHeader>
                     <validHeader>licenses/LICENSE_HEADER_TEMPLATE_SIEMENS_18.txt</validHeader>
                     <validHeader>licenses/LICENSE_HEADER_TEMPLATE_BOSCH.txt</validHeader>
                     <validHeader>licenses/LICENSE_HEADER_TEMPLATE_BOSCH_18.txt</validHeader>
                     <validHeader>licenses/LICENSE_HEADER_TEMPLATE_BOSCH_19.txt</validHeader>
                     <validHeader>licenses/LICENSE_HEADER_TEMPLATE_BOSCH_20.txt</validHeader>
                     <validHeader>licenses/LICENSE_HEADER_TEMPLATE_BOSCH_21.txt</validHeader>
                     <validHeader>licenses/LICENSE_HEADER_TEMPLATE_BOSCH_22.txt</validHeader>
                     <validHeader>licenses/LICENSE_HEADER_TEMPLATE_BOSCH_23.txt</validHeader>
                     <validHeader>licenses/LICENSE_HEADER_TEMPLATE_MICROSOFT_18.txt</validHeader>
                     <validHeader>licenses/LICENSE_HEADER_TEMPLATE_MICROSOFT_20.txt</validHeader>
                     <validHeader>licenses/LICENSE_HEADER_TEMPLATE_DEVOLO_19.txt</validHeader>
                     <validHeader>licenses/LICENSE_HEADER_TEMPLATE_DEVOLO_20.txt</validHeader>
                     <validHeader>licenses/LICENSE_HEADER_TEMPLATE_KIWIGRID_19.txt</validHeader>
                     <validHeader>licenses/LICENSE_HEADER_TEMPLATE_ENAPTER.txt</validHeader>
                  </validHeaders>
                  <excludes>
                     <exclude>.azure-pipelines/*</exclude>
                     <exclude>.devcontainer/*</exclude>
                     <exclude>**/banner.txt</exclude>
                     <exclude>**/helm/**</exclude>
                     <exclude>**/README</exclude>
                     <exclude>.3rd-party/**</exclude>
                     <exclude>.github/**</exclude>
                     <exclude>**/.git*</exclude>
                     <exclude>.git*</exclude>
                     <exclude>**/*.sql</exclude>
                     <exclude>eclipse_codeformatter.xml</exclude>
                     <exclude>**/addons.scss</exclude>
                     <exclude>**/VAADIN/widgetsets/**</exclude>
                     <exclude>.sonar</exclude>
                     <exclude>**/docker/**</exclude>
                     <exclude>**/.sonar/**</exclude>
                     <exclude>docs/content/**</exclude>
                     <exclude>docs/layouts/**</exclude>
                     <exclude>docs/static/**</exclude>
                     <exclude>docs/*.toml</exclude>
                     <exclude>**/LICENSE*</exclude>
                  </excludes>
                  <mapping>
                     <scss>JAVADOC_STYLE</scss>
                  </mapping>
               </configuration>
            </plugin>
            <plugin>
               <groupId>org.eclipse.m2e</groupId>
               <artifactId>lifecycle-mapping</artifactId>
               <version>1.0.0</version>
               <configuration>
                  <lifecycleMappingMetadata>
                     <pluginExecutions>
                        <pluginExecution>
                           <pluginExecutionFilter>
                              <groupId>org.apache.maven.plugins</groupId>
                              <artifactId>maven-dependency-plugin</artifactId>
                              <versionRange>[2.8,)</versionRange>
                              <goals>
                                 <goal>copy-dependencies</goal>
                              </goals>
                           </pluginExecutionFilter>
                           <action>
                              <ignore />
                           </action>
                        </pluginExecution>
                        <pluginExecution>
                           <pluginExecutionFilter>
                              <groupId>com.vaadin</groupId>
                              <artifactId>vaadin-maven-plugin</artifactId>
                              <versionRange>${vaadin.plugin.version}</versionRange>
                              <goals>
                                 <goal>resources</goal>
                                 <goal>update-widgetset</goal>
                              </goals>
                           </pluginExecutionFilter>
                           <action>
                              <ignore/>
                           </action>
                        </pluginExecution>
                     </pluginExecutions>
                  </lifecycleMappingMetadata>
               </configuration>
            </plugin>
            <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-surefire-plugin</artifactId>
               <version>${maven.surefire.plugin.version}</version>
               <configuration>
                  <systemPropertyVariables>
                     <!-- Set output directory according to allure-framework recommendation -->
                     <allure.results.directory>${project.build.directory}/allure-results</allure.results.directory>
                     <!-- Bugfix for timeout. See https://github.com/allure-framework/allure-maven/issues/59 -->
                     <allure.serve.timeout>650</allure.serve.timeout>
                  </systemPropertyVariables>
                  <!-- Bugfix for OpenJDK 8u181, see https://issues.apache.org/jira/browse/SUREFIRE-1588 -->
                  <useSystemClassLoader>false</useSystemClassLoader>
                  <reuseForks>true</reuseForks>
                  <forkCount>${surefire.forkcount}</forkCount>
                  <argLine>${jacoco.agent.ut.arg}</argLine>
                  <properties>
                     <property>
                        <name>listener</name>
                        <value>io.qameta.allure.junit5.AllureJunit5</value>
                     </property>
                  </properties>
                  <includes>
                     <include>**/*Tests.java</include>
                     <include>**/*Test.java</include>
                     <include>**/*IT.java</include>
                  </includes>
                  <excludes>
                     <exclude>**/Abstract*.java</exclude>
                  </excludes>
               </configuration>
            </plugin>
            <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-failsafe-plugin</artifactId>
               <version>${maven.failsafe.plugin.version}</version>
               <configuration>
                  <reuseForks>false</reuseForks>
                  <forkCount>${surefire.forkcount}</forkCount>
                  <argLine>-Xmx1024m ${jacoco.agent.ut.arg}</argLine>
                  <properties>
                     <property>
                        <name>listener</name>
                        <value>io.qameta.allure.junit5.AllureJunit5</value>
                     </property>
                  </properties>
               </configuration>
               <executions>
                  <execution>
                     <id>integration-test</id>
                     <phase>integration-test</phase>
                     <goals>
                        <goal>integration-test</goal>
                     </goals>
                  </execution>
               </executions>
            </plugin>
            <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-site-plugin</artifactId>
               <version>${maven.site.plugin.version}</version>
               <configuration>
                  <skip>true</skip>
                  <skipDeploy>true</skipDeploy>
               </configuration>
            </plugin>
            <plugin>
               <groupId>org.jacoco</groupId>
               <artifactId>jacoco-maven-plugin</artifactId>
               <version>${jacoco.version}</version>
            </plugin>
            <plugin>
               <groupId>org.bsc.maven</groupId>
               <artifactId>maven-processor-plugin</artifactId>
               <version>${maven.processor.plugin.version}</version>
            </plugin>
            <plugin>
               <groupId>com.ethlo.persistence.tools</groupId>
               <artifactId>eclipselink-maven-plugin</artifactId>
               <version>${eclipselink.maven.plugin.version}</version>
            </plugin>
         </plugins>
      </pluginManagement>
   </build>
   <profiles>
      <profile>
         <id>nexus_staging</id>
         <activation>
            <property>
               <name>!skipNexusStaging</name>
            </property>
         </activation>
         <build>
            <plugins>
               <plugin>
                  <!-- Use the Nexus Staging plugin as a full replacement
                     for the standard Maven Deploy plugin. See https://github.com/sonatype/nexus-maven-plugins/tree/master/staging/maven-plugin
                     why this makes sense :-) We can control whether we want to deploy to the
                     Eclipse repo or Maven Central by a combination of the version being a SNAPSHOT
                     or RELEASE version and property skipNexusStaging=true/false. In any case
                     we can take advantage of the plugin's "deferred deploy" feature which makes
                     sure that all artifacts of a multi-module project are deployed as a whole
                     at the end of the build process instead of deploying each module's artifacts
                     individually as part of building the module. -->
                  <groupId>org.sonatype.plugins</groupId>
                  <artifactId>nexus-staging-maven-plugin</artifactId>
                  <version>1.6.7</version>
                  <extensions>true</extensions>
                  <configuration>
                     <serverId>ossrh</serverId>
                     <nexusUrl>https://oss.sonatype.org/</nexusUrl>
                     <autoReleaseAfterClose>false</autoReleaseAfterClose>
                  </configuration>
               </plugin>
            </plugins>
         </build>
      </profile>
      <profile>
         <!-- this profile generates GPG signatures -->
         <id>create_gpg_signature</id>
         <activation>
            <activeByDefault>false</activeByDefault>
            <property>
               <name>createGPGSignature</name>
            </property>
         </activation>
         <build>
            <plugins>
               <plugin>
                  <groupId>org.apache.maven.plugins</groupId>
                  <artifactId>maven-gpg-plugin</artifactId>
                  <version>1.6</version>
                  <executions>
                     <execution>
                        <id>sign-artifacts</id>
                        <phase>verify</phase>
                        <goals>
                           <goal>sign</goal>
                        </goals>
                        <configuration>
                           <gpgArguments>
                              <arg>--pinentry-mode</arg>
                              <arg>loopback</arg>
                           </gpgArguments>
                        </configuration>
                     </execution>
                  </executions>
               </plugin>
            </plugins>
         </build>
      </profile>
   </profiles>

   <dependencyManagement>
      <dependencies>
         <!-- Hawkbit s3 extension -->
         <dependency>
            <groupId>org.eclipse.hawkbit</groupId>
            <artifactId>hawkbit-extension-artifact-repository-s3</artifactId>
            <version>0.3.0M8</version>
         </dependency>
         <!-- Vaadin -->
         <dependency>
            <groupId>com.vaadin</groupId>
            <artifactId>vaadin-bom</artifactId>
            <version>${vaadin.version}</version>
            <type>pom</type>
            <scope>import</scope>
         </dependency>
         <dependency>
            <groupId>com.vaadin</groupId>
            <artifactId>vaadin-spring-boot</artifactId>
            <version>${vaadin.spring.version}</version>
            <exclusions>
               <exclusion>
                  <groupId>com.vaadin</groupId>
                  <artifactId>vaadin-server</artifactId>
               </exclusion>
            </exclusions>            
         </dependency>
         <dependency>
            <groupId>org.vaadin.spring.addons</groupId>
            <artifactId>vaadin-spring-addon-eventbus</artifactId>
            <version>${vaadin.spring.addon.version}</version>
            <exclusions>
               <exclusion>
                  <groupId>com.vaadin</groupId>
                  <artifactId>vaadin-spring</artifactId>
               </exclusion>
            </exclusions>
         </dependency>
         <dependency>
            <groupId>org.vaadin.spring.extensions</groupId>
            <artifactId>vaadin-spring-ext-security</artifactId>
            <version>${vaadin.spring.addon.version}</version>
            <exclusions>
               <exclusion>
                  <groupId>com.vaadin</groupId>
                  <artifactId>vaadin-spring</artifactId>
               </exclusion>            
            </exclusions>
         </dependency>
         <dependency>
            <groupId>org.vaadin.alump.distributionbar</groupId>
            <artifactId>dbar-addon</artifactId>
            <version>${vaadin.addon.dbar-addon.version}</version>
            <exclusions>
               <exclusion>
                  <groupId>com.vaadin</groupId>
                  <artifactId>vaadin-server</artifactId>
               </exclusion>
            </exclusions>
         </dependency>

         <!-- Misc -->
         <dependency>
            <groupId>com.rabbitmq</groupId>
            <artifactId>http-client</artifactId>
            <version>${rabbitmq.http-client.version}</version>
         </dependency>
         <dependency>
            <groupId>com.cronutils</groupId>
            <artifactId>cron-utils</artifactId>
            <version>${cron-utils.version}</version>
         </dependency>
         <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>${jsoup.version}</version>
         </dependency>
         <dependency>
            <groupId>javax.el</groupId>
            <artifactId>javax.el-api</artifactId>
            <version>${javax.el-api.version}</version>
         </dependency>
         <dependency>
            <groupId>net.sf.corn</groupId>
            <artifactId>corn-cps</artifactId>
            <version>${corn-cps.version}</version>
         </dependency>
         <dependency>
            <groupId>com.github.gwtd3</groupId>
            <artifactId>gwt-d3-api</artifactId>
            <version>${vaadin.gwt-api.version}</version>
            <exclusions>
               <exclusion>
                  <groupId>com.google.gwt</groupId>
                  <artifactId>gwt-user</artifactId>
               </exclusion>
               <exclusion>
                  <groupId>junit</groupId>
                  <artifactId>junit</artifactId>
               </exclusion>
            </exclusions>
         </dependency>
         <dependency>
            <groupId>com.google.gwt</groupId>
            <artifactId>gwt-user</artifactId>
            <version>${vaadin.gwt-user.version}</version>
            <exclusions>
               <!-- Exclude javax.validation because a very old source.jar is referenced by this gwt-user dependency -->
               <exclusion>
                  <groupId>javax.validation</groupId>
                  <artifactId>validation-api</artifactId>
               </exclusion>
            </exclusions>
         </dependency>
         <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>${jaxb-api.version}</version>
         </dependency>

         <!-- Spring -->
         <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring.cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
         </dependency>
         <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>${spring.boot.version}</version>
            <exclusions>
               <exclusion>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-tomcat</artifactId>
               </exclusion>
               <exclusion>
                  <groupId>com.fasterxml.jackson.datatype</groupId>
                  <artifactId>jackson-datatype-jdk8</artifactId>
               </exclusion>
               <exclusion>
                  <groupId>com.fasterxml.jackson.datatype</groupId>
                  <artifactId>jackson-datatype-jsr310</artifactId>
               </exclusion>
               <exclusion>
                  <groupId>com.fasterxml.jackson.module</groupId>
                  <artifactId>jackson-module-parameter-names</artifactId>
               </exclusion>
            </exclusions>
         </dependency>
         <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <version>${spring.boot.version}</version>
            <scope>provided</scope>
         </dependency>
         <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <version>${spring.boot.version}</version>
            <exclusions>
               <exclusion>
                  <groupId>org.apache.logging.log4j</groupId>
                  <artifactId>log4j-to-slf4j</artifactId>
               </exclusion>
            </exclusions>
         </dependency>
         <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
            <version>${spring.boot.version}</version>
            <exclusions>
               <exclusion>
                  <groupId>org.hibernate</groupId>
                  <artifactId>hibernate-entitymanager</artifactId>
               </exclusion>
               <exclusion>
                  <groupId>org.hibernate</groupId>
                  <artifactId>hibernate-core</artifactId>
               </exclusion>
               <exclusion>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-logging</artifactId>
               </exclusion>
               <exclusion>
                  <groupId>javax.xml.bind</groupId>
                  <artifactId>jaxb-api</artifactId>
               </exclusion>
            </exclusions>
         </dependency>
         <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <version>${spring.boot.version}</version>
         </dependency>
         <dependency>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>org.eclipse.persistence.jpa</artifactId>
            <version>${eclipselink.version}</version>
         </dependency>
         <dependency>
            <groupId>org.springframework.plugin</groupId>
            <artifactId>spring-plugin-core</artifactId>
            <version>${spring.plugin.core.version}</version>
         </dependency>
         <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-oauth2-client</artifactId>
            <version>${spring-security-oauth2-client.version}</version>
         </dependency>

         <!-- Protostuff Io -->
         <dependency>
            <groupId>io.protostuff</groupId>
            <artifactId>protostuff-core</artifactId>
            <version>${io-protostuff.version}</version>
         </dependency>
         <dependency>
            <groupId>io.protostuff</groupId>
            <artifactId>protostuff-runtime</artifactId>
            <version>${io-protostuff.version}</version>
         </dependency>

         <!-- RSQL / FIQL parser -->
         <dependency>
            <groupId>cz.jirutka.rsql</groupId>
            <artifactId>rsql-parser</artifactId>
            <version>${rsql-parser.version}</version>
         </dependency>
         <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>${commons-io.version}</version>
         </dependency>
         <dependency>
            <groupId>io.qameta.allure</groupId>
            <artifactId>allure-junit5</artifactId>
            <version>${allure.version}</version>
            <scope>test</scope>
         </dependency>
         <dependency>
            <groupId>org.springframework.amqp</groupId>
            <artifactId>spring-rabbit-junit</artifactId>
            <version>${spring-amqp.version}</version>
            <scope>test</scope>
         </dependency>
         <dependency>
            <groupId>org.springframework.amqp</groupId>
            <artifactId>spring-rabbit-test</artifactId>
            <version>${spring-amqp.version}</version>
            <scope>test</scope>
         </dependency>
         <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>${guava.version}</version>
            <!-- https://github.com/google/guava/issues/2824 -->
            <exclusions>
               <exclusion>
                  <groupId>com.google.j2objc</groupId>
                  <artifactId>j2objc-annotations</artifactId>
               </exclusion>
               <exclusion>
                  <groupId>com.google.code.findbugs</groupId>
                  <artifactId>jsr305</artifactId>
               </exclusion>
               <exclusion>
                  <groupId>org.checkerframework</groupId>
                  <artifactId>checker-compat-qual</artifactId>
               </exclusion>
               <exclusion>
                  <groupId>com.google.errorprone</groupId>
                  <artifactId>error_prone_annotations</artifactId>
               </exclusion>
               <exclusion>
                  <groupId>com.google.j2objc</groupId>
                  <artifactId>j2objc-annotations</artifactId>
               </exclusion>
               <exclusion>
                  <groupId>org.codehaus.mojo</groupId>
                  <artifactId>animal-sniffer-annotations</artifactId>
               </exclusion>
            </exclusions>
         </dependency>
         <dependency>
            <groupId>org.awaitility</groupId>
            <artifactId>awaitility</artifactId>
            <version>${awaitility.version}</version>
         </dependency>
      </dependencies>
   </dependencyManagement>
</project>

Any ideas on what im missing in order to get the s3 artifact extension working in Kubernetes?

Thanks

paltaa commented 2 months ago

Okay after some time of tinkering, this is the correct Dockerfile that works to build hawkbit with mysql and s3 extension:

ARG JAVA_VERSION=17.0.11_9
FROM eclipse-temurin:${JAVA_VERSION}-jdk-alpine as build

ARG HAWKBIT_APP=hawkbit-update-server
ARG HAWKBIT_VERSION=pass_as_buils_arg

ENV BUILD_DIR=/opt/hawkbit_build
ENV APP=hawkbit-runtime
ENV VERSION=${HAWKBIT_VERSION}

RUN mkdir -p ${BUILD_DIR}/app
RUN apk add --no-cache --virtual build-dependencies gnupg unzip libressl wget git maven

ARG MARIADB_DRIVER_VERSION=2.7.8

RUN wget -O ${BUILD_DIR}/mariadb-java-client-${MARIADB_DRIVER_VERSION}.jar --no-verbose https://downloads.mariadb.com/Connectors/java/connector-java-${MARIADB_DRIVER_VERSION}/mariadb-java-client-${MARIADB_DRIVER_VERSION}.jar 
RUN wget -O ${BUILD_DIR}/mariadb-java-client-${MARIADB_DRIVER_VERSION}.jar.asc --no-verbose https://downloads.mariadb.com/Connectors/java/connector-java-${MARIADB_DRIVER_VERSION}/mariadb-java-client-${MARIADB_DRIVER_VERSION}.jar.asc

## Building hawkbit from source
RUN git clone https://github.com/eclipse/hawkbit.git ${BUILD_DIR}/hawkbit --branch  ${HAWKBIT_VERSION}

RUN git clone https://github.com/eclipse/hawkbit-extensions ${BUILD_DIR}/hawkbit/hawkbit-extensions --branch ${HAWKBIT_VERSION}

WORKDIR ${BUILD_DIR}/hawkbit/hawkbit-extensions/hawkbit-extension-artifact-repository-s3

RUN mvn install --batch-mode -DskipTests -T $(nproc) -Dmaven.artifact.threads=$(nproc)

WORKDIR ${BUILD_DIR}/hawkbit 

RUN cp ./hawkbit-extensions/hawkbit-extension-artifact-repository-s3/target/hawkbit-extension-artifact-repository-s3-*.jar ${BUILD_DIR}/hawkbit/hawkbit-runtime/hawkbit-update-server/src/main/resources/

ARG HAWKBIT_EXTRA_DEPENDENCIES_S3="\n\
       <!-- Extension for using S3 as artifact storage. -->\n\
       <dependency>\n\
           <groupId>org.eclipse.hawkbit</groupId>\n\
           <artifactId>hawkbit-extension-artifact-repository-s3</artifactId>\n\
           <version>\${project.version}</version>\n\
       </dependency>"
RUN sed -i "s|<dependencies>|<dependencies>${HAWKBIT_EXTRA_DEPENDENCIES_S3}|" hawkbit-runtime/hawkbit-update-server/pom.xml

RUN mvn versions:set -DnewVersion=${HAWKBIT_VERSION}
RUN mvn clean install -DskipTests --debug -Dspring.profiles.active=custom,mysql -Daws.region=us-east-1 -T $(nproc) -Dmaven.artifact.threads=$(nproc)
ENV HAWKBIT_JAR=${BUILD_DIR}/hawkbit/hawkbit-runtime/hawkbit-update-server/target/hawkbit-update-server-${HAWKBIT_VERSION}.jar
RUN java -Djarmode=layertools -jar ${HAWKBIT_JAR} extract --destination ${BUILD_DIR}

FROM eclipse-temurin:${JAVA_VERSION}-jre-alpine
ARG MARIADB_DRIVER_VERSION=2.7.8
ARG HAWKBIT_VERSION=pass_as_buils_arg
ENV HAWKBIT_JAR=/opt/hawkbit_build/hawkbit/hawkbit-runtime/hawkbit-update-server/target/hawkbit-update-server-${HAWKBIT_VERSION}.jar
RUN addgroup -S hawkbit_group && adduser -D hawkbit -G hawkbit_group
RUN mkdir -p /artifactrepo && chown -R hawkbit /artifactrepo
USER hawkbit
ENV BUILD_DIR=/opt/hawkbit_build
WORKDIR /opt/hawkbit
COPY --from=build /opt/hawkbit_build/mariadb-java-client-${MARIADB_DRIVER_VERSION}.jar ./BOOT-INF/lib/
COPY --from=build ${BUILD_DIR}/dependencies/ ./
COPY --from=build ${BUILD_DIR}/spring-boot-loader/ ./
COPY --from=build ${BUILD_DIR}/snapshot-dependencies/ ./
COPY --from=build ${BUILD_DIR}/application/ .
# COPY --from=build ${HAWKBIT_JAR}  /opt/hawkbit

ARG CONTAINER_PORT=8080
ENV JAVA_OPTS="-Dspring.profiles.active=mysql -Xms768m -Xmx768m -XX:MaxMetaspaceSize=250m -XX:MetaspaceSize=250m -Xss300K -XX:+UseG1GC -XX:+UseStringDeduplication -XX:+UseCompressedOops -XX:+HeapDumpOnOutOfMemoryError"

VOLUME "/artifactrepo"
EXPOSE ${CONTAINER_PORT}
ENTRYPOINT ["sh", "-c", "java ${JAVA_OPTS} org.springframework.boot.loader.JarLauncher ${@}"]

This is the command to build for macos arm:

docker build --build-arg HAWKBIT_VERSION=${HAWKBIT_VERSION} -t (YOUR_IMAGE_REPO):${HAWKBIT_VERSION} . --platform=linux/amd64

Hope this helps someone in the future