首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >gradle docker插件bmuschko将一个build.gradle拆分为两个文件会出现错误

gradle docker插件bmuschko将一个build.gradle拆分为两个文件会出现错误
EN

Stack Overflow用户
提问于 2018-05-18 07:15:38
回答 2查看 2.7K关注 0票数 1

我刚开始使用gradle脚本。我有一个build.gradle文件,我想将其拆分为两个文件。拆分较大的build.gradle文件后,我得到了以下两个文件。

build.gradle

代码语言:javascript
运行
复制
buildscript {
    ext {
        springBootVersion = '1.5.12.RELEASE'
        gradleDockerVersion = '3.2.7'
    }
    repositories {
        jcenter()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
        classpath("com.bmuschko:gradle-docker-plugin:${gradleDockerVersion}")
    }
}

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

jar {
    baseName = 'gs-spring-boot'
    version =  '0.1.0'
}

repositories {
    mavenCentral()
}

sourceCompatibility = 1.8
targetCompatibility = 1.8
compileJava.options.encoding = 'UTF-8'

dependencies {
    compile("org.springframework.boot:spring-boot-starter-web")
    testCompile("junit:junit")
}
project.ext.imageName = 'myImage'
project.ext.tagName ='myTag'
project.ext.jarName = (jar.baseName + '-' + jar.version).toLowerCase()

apply from: 'dockerapp.gradle'

dockerapp.gradle

代码语言:javascript
运行
复制
def gradleDockerVersion = '3.7.2'
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath("com.bmuschko:gradle-docker-plugin:${gradleDockerVersion}")
    }
}

apply plugin: 'com.bmuschko.docker-remote-api'

import com.bmuschko.gradle.docker.tasks.image.DockerBuildImage
import com.bmuschko.gradle.docker.tasks.image.DockerRemoveImage
import com.bmuschko.gradle.docker.tasks.image.Dockerfile

def imageName = project.ext.imageName
def tagName = project.ext.tagName
def jarName = project.ext.jarName

task createAppDockerfile(type: Dockerfile) {
    // Don't create dockerfile if file already exists
    onlyIf { !project.file('Dockerfile').exists() }
    group 'Docker'
    description 'Generate docker file for the application'
    dependsOn bootRepackage
    destFile = project.file('Dockerfile')
    String dockerProjFolder = project.projectDir.name
    from 'openjdk:8-jre-slim'
    runCommand("mkdir -p /app/springboot/${dockerProjFolder} && mkdir -p /app/springboot/${dockerProjFolder}/conf")
    addFile("./build/libs/${jarName}.jar", "/app/springboot/${dockerProjFolder}/")
    environmentVariable('CATALINA_BASE', "/app/springboot/${dockerProjFolder}")
    environmentVariable('CATALINA_HOME', "/app/springboot/${dockerProjFolder}")
    workingDir("/app/springboot/${dockerProjFolder}")
    if (System.properties.containsKey('debug')) {
        entryPoint('java', '-Xdebug', '-Xrunjdwp:server=y,transport=dt_socket,address=5005,suspend=n', '-jar', "/app/springboot/${dockerProjFolder}/${jarName}.jar")
    } else {
        entryPoint('java', '-jar', "/app/springboot/${dockerProjFolder}/${jarName}.jar")
    }
}

task removeAppImage(type: DockerRemoveImage) {
    group 'Docker'
    description 'Remove the docker image using force'
    force = true
    targetImageId { imageName }
    onError { exception ->
        if (exception.message.contains('No such image')) {
            println 'Docker image not found for the current project.'
        }
    }
}

task createAppImage(type: DockerBuildImage) {
    group 'Docker'
    description 'Executes bootRepackage, generates a docker file and builds image from it'
    dependsOn(createAppDockerfile, removeAppImage)
    dockerFile = createAppDockerfile.destFile
    inputDir = dockerFile.parentFile
    if (tagName)
        tag = "${tagName}"
    else if (imageName)
        tag = "${imageName}"
    else
        tag = "${jarName}"
}

如果我尝试运行命令./gradlew createAppImage,则会得到如下错误:

dockerapp.gradle文件中的其他两个任务似乎工作正常。如果我将所有代码放在build.gradle文件中,它就能正常工作,不会出现任何错误。拆分文件并执行createAppImage而不会出错的最佳方法是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-30 07:06:13

我在CDancy (插件的维护者)的帮助下解决了这个问题,如下所示:

build.gradle

代码语言:javascript
运行
复制
buildscript {
    ext {
        springBootVersion = '1.5.12.RELEASE'
        gradleDockerVersion = '3.2.7'
    }
    repositories {
        jcenter()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
        classpath("com.bmuschko:gradle-docker-plugin:${gradleDockerVersion}")
    }
}    

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

jar {
    baseName = 'gs-spring-boot'
    version =  '0.1.0'
}    

repositories {
    mavenCentral()
}    

sourceCompatibility = 1.8
targetCompatibility = 1.8
compileJava.options.encoding = 'UTF-8'    

dependencies {
    compile("org.springframework.boot:spring-boot-starter-web")
    testCompile("junit:junit")
}
project.ext.imageName = 'myimage'
project.ext.tagName ='mytag'
project.ext.jarName = (jar.baseName + '-' + jar.version).toLowerCase()    

apply from: 'docker.gradle'

docker.gradle

代码语言:javascript
运行
复制
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.bmuschko:gradle-docker-plugin:3.2.7'
    }
}
repositories {
    jcenter()
}
// use fully qualified class name
apply plugin: com.bmuschko.gradle.docker.DockerRemoteApiPlugin    

// import task classes
import com.bmuschko.gradle.docker.tasks.image.*    

def imageName = project.ext.imageName
def tagName = project.ext.tagName
def jarName = project.ext.jarName    

task createAppDockerfile(type: Dockerfile) {
    // Don't create dockerfile if file already exists
    onlyIf { !project.file('Dockerfile').exists() }
    group 'Docker'
    description 'Generate docker file for the application'
    dependsOn bootRepackage
    destFile = project.file('Dockerfile')
    String dockerProjFolder = project.projectDir.name
    from 'openjdk:8-jre-slim'
    runCommand("mkdir -p /app/springboot/${dockerProjFolder} && mkdir -p /app/springboot/${dockerProjFolder}/conf")
    addFile("./build/libs/${jarName}.jar", "/app/springboot/${dockerProjFolder}/")
    environmentVariable('CATALINA_BASE', "/app/springboot/${dockerProjFolder}")
    environmentVariable('CATALINA_HOME', "/app/springboot/${dockerProjFolder}")
    workingDir("/app/springboot/${dockerProjFolder}")
    if (System.properties.containsKey('debug')) {
        entryPoint('java', '-Xdebug', '-Xrunjdwp:server=y,transport=dt_socket,address=5005,suspend=n', '-jar', "/app/springboot/${dockerProjFolder}/${jarName}.jar")
    } else {
        entryPoint('java', '-jar', "/app/springboot/${dockerProjFolder}/${jarName}.jar")
    }
}    

task removeAppImage(type: DockerRemoveImage) {
    group 'Docker'
    description 'Remove the docker image using force'
    force = true
    targetImageId { imageName }
    onError { exception ->
        if (exception.message.contains('No such image')) {
            println 'Docker image not found for the current project.'
        } else {
            print exception
        }
    }
}    

task createAppImage(type: DockerBuildImage) {
    group 'Docker'
    description 'Executes bootRepackage, generates a docker file and builds image from it'
    dependsOn(createAppDockerfile, removeAppImage)
    dockerFile = createAppDockerfile.destFile
    inputDir = dockerFile.parentFile
    if (tagName)
        tag = "${tagName}"
    else if (imageName)
        tag = "${imageName}"
    else
        tag = "${jarName}"
}

更改基本上是在我的docker.gradle文件中进行的,我必须添加指向jcenter()的存储库部分,并使用完全限定的插件类名。

票数 1
EN

Stack Overflow用户

发布于 2019-09-03 02:46:29

我想知道为什么你会想在你的Gradle中使用Docker插件?在使用了维护时间最长的Mushko's Gradle Docker Plugin之后,我不明白为什么要用不同的语法在docker样板上构建插件样板?

Gradle中的容器化对于程序员来说很舒服,DevOps会说他们不能像这样工作,如果你需要支持,你应该按照他们的方式工作。我在下面找到了一个简短的、纯Docker风格的、功能齐全的解决方案。

在工程结构中找到普通的Dockerfile和docker.sh外壳脚本:

build.gradle文件中:

代码语言:javascript
运行
复制
    buildscript {
        repositories {
            gradlePluginPortal()
        }
    }

    plugins {
        id 'java'
        id 'application'
    }

    // Entrypoint:

    jar {
        manifest {
            attributes 'Main-Class': 'com.example.Test'
        }
    }

    mainClassName = 'com.example.Test'

    // Run in DOCKER-container:

    task runInDockerContainer {
        doLast {
            exec {
                workingDir '.' // Relative to project's root folder.
                commandLine 'sh', './build/resources/main/docker.sh'
            }
    //        exec {
    //            workingDir "."
    //            commandLine 'sh', './build/resources/main/other.sh'
    //        }
        }
    }

遵循普通的Docker文档,在干净的shell脚本中做任何你想做的事情:

代码语言:javascript
运行
复制
    # Everything is run relative to project's root folder:

    # Put everything together into build/docker folder for DOCKER-build:
    if [ -d "build/docker" ]; then rm -rf build/docker; fi;
    mkdir build/docker;
    cp build/libs/test.jar build/docker/test.jar;
    cp build/resources/main/Dockerfile build/docker/Dockerfile;

    # Build image from files in build/docker:
    cd build/docker || exit;
    docker build . -t test;

    # Run container based on image:
    echo $PWD
    docker run test;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50401722

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档