一、se.transmode.gradle 插件打包
- 添加插件
buildscript {
dependencies {
// docker插件
classpath('se.transmode.gradle:gradle-docker:1.2')
}
}
- 应用插件
// docker插件
apply plugin: 'application'
apply plugin: 'docker'
如果添加了 application 插件的话,默认 gradle-docker 插件会添加一个 distDocker 的 gradle task,用来构建一个 包含所有程序文件 的 docker 镜像。
- 配置镜像构建信息
配置group
group 'com.xtsz.iot'
配置镜像名称和版本号
version '1.0.0'
其中镜像的 tag 默认的构成为:项目组/应用名称:版本号
tag = "${project.group}/${applicationName}:${tagVersion}"
project.group:标准的 gradle 属性,如果不进行定义,插件默认会 省略 ${project.group} 这个属性。
applicationName:应用被容器化时的 名称。
tagVersion:可选属性,会作为镜像的 标签。默认值为 project.version,如果未指定 project.version,则使用 latest 作为标记。
配置docker构建基础信息:
distDocker {
baseImage = "openjdk"
maintainer = "marquis"
}
其中,baseImage 相当于 Dockerfile 中声明的 FROM。声明了在 构建镜像 是基于的 Image,maintainer 相当于 MAINTAINER ,声明了 镜像作者。如果声明了 registry 地址,插件在 镜像射生成后 可以自动 push 到该地址。其他的配置还包括 docker hub 的 地址、用户名 和 密码。
docker {
baseImage 'openjdk'
maintainer 'marquis'
useApi true
hostUrl 'http://myserver:4243'
apiUsername 'user'
apiPassword 'password'
apiEmail '[email protected]'
}
- 添加task任务
完成了基本的配置,我们还需要添加一个 task 用来在 gradle 编译的时候 执行镜像构建。
插件提供了一些 转换方法,用来指代 Dockerfile 中的 关键词语法:
Dockerfile关键词 | gradle task方法 |
---|---|
ADD | addFile(Closure copySpec) addFile(String source, String dest) addFile(File source, String dest) |
CMD | defaultCommand(List cmd) |
ENTRYPOINT | entryPoint(List entryPoint) |
ENV | setEnvironment(String key, String val) |
EXPOSE | exposePort(Integer port) exposePort(String port) |
RUN | runCommand(String cmd) |
USER | switchUser(String userNameOrUid) |
VOLUME | volume(String… paths) |
WORKDIR | workingDir(String dir) |
taskBuilder 的任务配置:
task dockerBuilder(type: Docker) {
applicationName = jar.baseName
tagVersion = jar.version
volume('/tmp')
addFile("${archivesBaseName}-${version}.jar", "app.jar")
entryPoint(["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", 'app.jar'])
exposePort(8080)
doFirst {
copy {
from jar
into stageDir
}
}
}
构建完成以后,项目根目录的 build/docker 文件夹下面会出现 Dockerfile 和 spring-boot-gradle-for-docker-1.0.jar 文件。其中,以上的 task 等同于以下的 Dockerfile。
FROM aglover/java8-pier
VOLUME ["/tmp"]
ADD spring-boot-gradle-for-docker-1.0.jar app.jar
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "app.jar"]
EXPOSE 8080
如果觉的在 task 中编写 Dockerfile 替换脚本 非常别扭,也可以直接在 task 中指定 Dockfile 的 文件路径,直接使用已有的文件来生成镜像:
task buildDocker(type: Docker) {
applicationName = jar.baseName
tagVersion = jar.version
dockerfile = file('Dockerfile')
doFirst {
copy {
from jar
into stageDir
}
}
}
通过 file() 指定 task 使用位于 项目根目录 的 Dockerfile 来生产镜像。
- 编译并构建Docker镜像
进入项目根目录,运行 gradle 命令进行打包构建。
$ ./gradlew clean build dockerBuilder --info
gradle 首先会运行 本地测试,然后进行项目打包,进一步根据 docker-gradle 插件进行镜像构建。
等待出现 BUILD SUCCESSFUL 就表明任务运行成功。可以观察到镜像的名称为:
io.ostenant.springboot.sample/spring-boot-gradle-for-docker:1.0
运行 docker images 查看本地镜像,进一步验证镜像构建成功。
二、com.palantir.docker 插件打包
- 父模块
// 添加插件
plugins {
id "com.palantir.docker" version "0.22.1"
}
// 添加仓库与插件依赖
buildscript {
repositories {
maven {
url "https://plugins.gradle.org/m2/"
}
}
dependencies {
classpath "gradle.plugin.com.palantir.gradle.docker:gradle-docker:0.22.1"
}
}
// 应用插件
apply plugin: 'application'
apply plugin: "com.palantir.docker"
- 子模块
archivesBaseName = 'iot-eruake'
mainClassName='com.xtsz.iot.eruake.IotEruakeApplication'
//依赖
dependencies {
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-server'
}
三、使用IdeaDocker插件布署
-
Idea安装插件
-
配置docker:
-
配置Dockerfile文件
1)新建Dockerfile文件会自动弹出。
在工程根目录下新建Dockerfile文件,内容如下:
FROM openjdk:8
MAINTAINER marquis
COPY build/libs/iot-eruake-1.0.0.jar app.jar
RUN bash -c "touch /app.jar"
EXPOSE 8080
ENTRYPOINT ["java","-jar","app.jar"]
-
创建docker镜像
-
发布完成