Alpine Docker Образ для запуска исполняемого файла JLink - PullRequest
0 голосов
/ 18 июня 2020

Мое текущее Docker изображение примерно 200MB. Моя цель - максимально уменьшить это количество, поэтому я подумал, что изображение alpine будет отличным способом добиться этого. Однако я продолжаю сталкиваться с препятствиями.

Это многомодульный проект libGDX, который использует Java 14 и его функции предварительного просмотра вместе с JLink (из JPackage) для создания пользовательской (облегченной) JRE. .

Мне нужно только развернуть модуль server, который зависит от модуля common (который также использует модуль client).

Я предоставлю все необходимые файлы ниже, но если мне чего-то не хватает, вот ссылка на репо: https://github.com/payne911/marvelous-bob/tree/dev

Текущая проблема

Я либо получаю:

  • при выполнении ./server: file not found для исполняемого файла, который я знаю, существует и является исполняемым , где я пытаюсь запустить его в Docker образе
  • при выполнении apk add --no-cache someLibrary: a segfault: core dumped при попытке загрузить библиотеки в моем ENTRYPOINT, которые, как я думал, необходимы для выполнения этого файла (libstdc++ и libc6-compat)

Цель

Облегченный многоразовый Docker Образ, содержащий все для запуска исполняемых файлов libGDX, созданных JLink.

Текущие файлы, которые находятся в рабочем состоянии, и я пытаюсь выполнить рефакторинг

Dockerfile

FROM openjdk:14-jdk-alpine
COPY server/build/libs/server-all.jar /app.jar
COPY utils/deploys/bootstrap.sh /bootstrap.sh
RUN chmod +x /bootstrap.sh
EXPOSE 80
ENTRYPOINT ["./bootstrap.sh"]

bootstrap.sh

#!/usr/bin/env sh
echo "========== LAUNCHING SERVER APP ========="
apk add --no-cache libstdc++
java --enable-preview -jar /app.jar

build.gradle файлы

root

buildscript {
    repositories {
        mavenLocal()
        mavenCentral()
        maven { url "https://plugins.gradle.org/m2/" }
        maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
        jcenter()
        google()
    }
    dependencies {
    }
}

// to force download of sources and JavaDoc
plugins {
    id 'java'
    id 'idea'
}
idea {
    module {
        downloadJavadoc = true
        downloadSources = true
    }
}

allprojects {

    version = '1.0'
    ext {
        appName = "marvelous-bob"
        gdxVersion = '1.9.10'
        roboVMVersion = '2.3.7'
        box2DLightsVersion = '1.5'
        ashleyVersion = '1.7.0'
        aiVersion = '1.8.2'

        slf4j = '1.7.26'
        logback = '1.2.3'
        lombok = '1.18.12'
        kryonet = '2.22.6'
        reflectionsVersion = '0.9.12'

        pieMenuVersion = '4.2.0'
        shapeDrawer = '2.3.0'
    }

    repositories {
        mavenLocal()
        mavenCentral()
        jcenter()
        google()
        maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
        maven { url "https://oss.sonatype.org/content/repositories/releases/" }
        maven { url 'https://jitpack.io' }
    }
}

project(":desktop") {
    apply plugin: "java-library"


    dependencies {
        api project(":client")
        api "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop"
        api "com.badlogicgames.gdx:gdx-box2d-platform:$gdxVersion:natives-desktop"
        api "com.badlogicgames.gdx:gdx-tools:$gdxVersion"
    }
}

project(":client") {
    apply plugin: "java-library"


    dependencies {
        api project(":common")
        api "com.badlogicgames.gdx:gdx-backend-lwjgl:$gdxVersion"

        api "space.earlygrey:shapedrawer:$shapeDrawer"
        api "com.github.payne911:PieMenu:$pieMenuVersion"
    }
}

project(":server") {
    apply plugin: "java-library"


    dependencies {
        api project(":common")
        api "com.badlogicgames.gdx:gdx-backend-headless:$gdxVersion"
        api "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop"
    }
}

project(":common") {
    apply plugin: "java-library"


    dependencies {
        api "com.badlogicgames.gdx:gdx:$gdxVersion"
        api "com.badlogicgames.gdx:gdx-box2d:$gdxVersion"
        api "com.badlogicgames.box2dlights:box2dlights:$box2DLightsVersion"
        api "com.badlogicgames.gdx:gdx-ai:$aiVersion"

        // todo: do we need both logging libraries? p.s. kryonet uses Minlog
        api "org.slf4j:slf4j-api:$slf4j"
        api "ch.qos.logback:logback-classic:$logback"
        api "com.github.crykn:kryonet:$kryonet"
        api "org.reflections:reflections:$reflectionsVersion"
    }
}

общие

plugins {
    id 'java'
    id 'io.freefair.lombok' version '5.1.0'
}

sourceCompatibility = 14
[compileJava, compileTestJava]*.options*.encoding = 'UTF-8'

tasks.withType(JavaCompile) {
    options.compilerArgs += "--enable-preview"
}
tasks.withType(Test) {
    jvmArgs += "--enable-preview"
}
tasks.withType(JavaExec) {
    jvmArgs += '--enable-preview'
}

sourceSets.main.java.srcDirs = [ "src/" ]

jar {
    from('src') {
        include '**/*.properties'
    }
}

сервер

plugins {
    id 'java'
    id 'io.freefair.lombok' version '5.1.0'
    id 'com.github.johnrengelman.shadow' version '5.2.0'
}

sourceCompatibility = 14
[compileJava, compileTestJava]*.options*.encoding = 'UTF-8'
tasks.withType(JavaCompile) {
    options.compilerArgs += "--enable-preview"
}
tasks.withType(Test) {
    jvmArgs += "--enable-preview"
}
tasks.withType(JavaExec) {
    jvmArgs += '--enable-preview'
}
sourceSets.main.java.srcDirs = [ "src/" ]

jar {
    project.version="" // to remove version number from the built jar's name
    manifest {
        attributes 'Main-Class': 'com.marvelousbob.server.BobServerLauncher'
    }
}

Действия GitHub yml файл

jobs:
  deploy:
    name: Deploy
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: Setup with Java 14
        id: java-setup
        uses: actions/setup-java@v1
        with:
          java-version: 14

      - name: Allow GitHub Actions to run Gradlew
        run: chmod u+x gradlew

      - name: Run Gradle build
        id: gradle-build
        uses: eskatos/gradle-command-action@v1
        with:
          arguments: shadowJar

      # more stuff ...

Что я пробовал

Так много всего за несколько дней! Вот состояние моей последней попытки.

Dockerfile

FROM alpine:3.7
COPY server/build/jpackage/server /server
FROM openjdk:14-jdk-alpine
COPY server/build/libs/server-all.jar /app.jar
COPY utils/deploys/bootstrap.sh /bootstrap.sh
RUN chmod +x /bootstrap.sh
EXPOSE 80
ENTRYPOINT ["./bootstrap.sh"]

bootstrap.sh

#!/bin/sh
echo "========== LAUNCHING SERVER APP ========="
cd /server/bin
chmod +x server
./server

build.gradle

root

То же, что и другой.

Обычный

То же, что и другой.

сервер

plugins {
    id 'java'
    id 'io.freefair.lombok' version '5.1.0'
    id 'org.beryx.runtime' version '1.8.4'
}

sourceCompatibility = 14
[compileJava, compileTestJava]*.options*.encoding = 'UTF-8'
tasks.withType(JavaCompile) {
    options.compilerArgs += "--enable-preview"
}
tasks.withType(Test) {
    jvmArgs += "--enable-preview"
}
tasks.withType(JavaExec) {
    jvmArgs += '--enable-preview'
}
sourceSets.main.java.srcDirs = [ "src/" ]

mainClassName = "com.marvelousbob.server.BobServerLauncher"

task dist(type: Jar) {
    project.version="1" // adjust the CI/CD if you change this
    manifest {
        attributes 'Main-Class': project.mainClassName
    }
    from {
        configurations.compileClasspath.collect { it.isDirectory() ? it : zipTree(it) }
    }
    with jar

    destinationDirectory = file("$buildDir/lib")
}

jpackageImage.dependsOn dist
dist.dependsOn classes

// JLink configuration to minimize size of generated jar
runtime {
    options = ['--strip-debug',
               '--compress', '2',
               '--no-header-files',
               '--no-man-pages',
               '--strip-native-commands',
               '--vm', 'server']
    modules = ['java.base' ,
               'java.desktop',
               'jdk.unsupported']
    distDir = file(buildDir)

    jpackage {
        //jpackageHome = '/usr/lib/jvm/open-jdk'
        mainJar = dist.archiveFileName.get()
    }
}

Github Actions yml файл

jobs:
  deploy:
    name: Deploy
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: Setup with Java 14
        id: java-setup
        uses: actions/setup-java@v1
        with:
          java-version: 14

      - name: Building with Gradlew
        run: |
          chmod u+x gradlew
          ./gradlew server:jpackageImage

      # more stuff ...
...