Учебник для весенней загрузки с докером не работает? - PullRequest
0 голосов
/ 15 октября 2019

Я следовал официальному загрузчику весенних загрузок для учебника gradle, но не могу заставить его работать.

Мой build.gradle

buildscript {
    repositories {
        mavenCentral()
        maven {
            url "https://plugins.gradle.org/m2/"
        }
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:2.1.6.RELEASE")
        classpath('gradle.plugin.com.palantir.gradle.docker:gradle-docker:0.22.1')
    }
}

group = 'springio'

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
apply plugin: 'com.palantir.docker'

task unpack(type: Copy) {
    dependsOn bootJar
    from(zipTree(tasks.bootJar.outputs.files.singleFile))
    into("build/dependency")
}
docker {
    name "${project.group}/${bootJar.baseName}"
    copySpec.from(tasks.unpack.outputs).into("dependency")
    buildArgs(['DEPENDENCY': "dependency"])
}

bootJar {
    baseName = 'globalstatus'
}

sourceCompatibility = 1.8
targetCompatibility = 1.8

repositories {
    mavenCentral()
}


dependencies {
    implementation('org.springframework.boot:spring-boot-starter-web')
    testImplementation('org.springframework.boot:spring-boot-starter-test')
}

Мой Dockerfile

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

gradlew build дает мне действительный и работоспособный JAR

Но если я сделаю gradlew build docker и затем начну контейнер, я получу

Error: Invalid or corrupt jarfile /app.jar

1 Ответ

1 голос
/ 17 октября 2019

app.jar должен быть исполняемым файлом jar, но вместо этого это каталог. Поскольку JAR_FILE не установлен в качестве аргумента сборки, инструкция COPY копирует содержимое каталога <project_dir>/build/docker в каталог /app.jar в контейнере. Вы можете перечислить его с помощью:

 docker run --entrypoint="ls" springio/globalstatus -la /app.jar

Чтобы исправить сборку, вам нужно изменить задачу докера:

docker {
    name "${project.group}/${bootJar.baseName}"
    copySpec.from(tasks.bootJar.outputs).into("jars")
    buildArgs(['JAR_FILE': "jars/${bootJar.archiveName}"])
}

Объяснение: Окно докера плагин рабочий каталог <project_dir>/build/docker, поэтому, когда образ докера создается, операции над файлом выполняются относительно этого пути.

copySpec копирует выходные данные задачи bootJar в каталог build/docker/jars,buildArgs устанавливает в качестве аргумента сборки JAR_FILE имя архива (файл JAR весенней загрузки). Когда образ собирается из Dockerfile, инструкция COPY добавит файл jar в корневой каталог контейнера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...