【问题标题】:Tutorial for spring boot with docker not working?docker不工作的spring boot教程?
【发布时间】:2020-02-12 07:58:15
【问题描述】:

我已经按照官方 spring boot docker for 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

【问题讨论】:

标签: spring-boot docker gradle


【解决方案1】:

app.jar 应该是一个可执行的jar 文件,但它是一个目录。因为JAR_FILE 未设置为构建参数,所以COPY 指令将<project_dir>/build/docker 目录的内容复制到容器中的/app.jar 目录中。你可以列出它:

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

要修复构建,您需要更改 docker 任务:

docker {
    name "${project.group}/${bootJar.baseName}"
    files bootJar.outputs
    buildArgs(['JAR_FILE': bootJar.archiveFileName.get()])
}

解释: docker gradle plugin 工作目录是 <project_dir>/build/docker 所以当 docker 镜像是构建文件时,操作是相对于这个路径的。

filesbootJar 任务的输出复制到build/docker 目录中。 buildArgs 将构建参数 JAR_FILE 设置为存档的名称(spring boot jar 文件)。从Dockerfile构建镜像时,COPY指令会将jar文件添加到容器的根目录中。

【讨论】:

  • 这是正确答案;但是@earandap 的建议让我改用了更好的解决方案。
猜你喜欢
  • 1970-01-01
  • 2018-10-21
  • 2018-06-25
  • 2018-05-23
  • 2017-12-21
  • 2019-06-06
  • 1970-01-01
  • 1970-01-01
  • 2019-04-25
相关资源
最近更新 更多