通常我们使用 Dockerfile 来构建项目的Docker 镜像,但是也有需求希望使用 gralde 在编译项目的时候一起把镜像给构建并上传,所以该教程讲解了使用 gradle 编写配置 Dockerfile 并生成镜像的过程。
1. 添加依赖
教程使用gradle-docker插件来实现,在 Gradle 的脚本里配置 dockerfile 的构建镜像功能。
gradle-docker
插件已经包含在 jCenter 和 MavenCentral中。所以只需要在dependencies
添加依赖就能使用 docker 插件。
build.gradle
中的配置如下,其他配置省略:
buildscript {
...
dependencies {
//添加gradle-docker 依赖,版本1.2
classpath 'se.transmode.gradle:gradle-docker:1.2'
}
}
2. 应用插件
添加以下代码到 build.gradle
apply plugin: 'application' //可选配置
apply plugin: 'docker'
如果添加了application
插件的话,默认gradle-docker
插件会添加一个distDocker
的 gralde task,用来构建一个包含所有程序文件的 docker 镜像。
3. 配置镜像构建信息
- 配置 group:
group = 'my-group'
- 配置镜像名字和版本号:
jar {
baseName = 'spring-boot-docker'
version = '1.2.3'
}
配置了以上信息之后,构建的 Docker 镜像名就是:my-group/spring-boot-docker:1.2.3,可以根据实际需要进行修改。
- 配置 docker 构建基础信息:
docker {
baseImage 'frolvlad/alpine-oraclejdk8:slim'
maintainer 'mcjiffy mcjiffy@mcjiffy'
registry 'localhost:5000'
}
其中,baseImage
相当于Dockerfile
中声明的 FROM
。声明了在构建镜像是基于的 Image,maintainer相当于MAINTAINER
声明了镜像作者。如果声明了registry
地址,插件在镜像射生成后可以自动 push到该地址。其他还可以配置 docker hub 的地址、用户名和密码,用来生成镜像后自动 push。
4. 添加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) |
- 构建 spring-boot 项目 task 示例:
task dockerBuilder(type: Docker) {
applicationName = jar.baseName
tagVersion = jar.version
volume('/tmp')
addFile("${jar.baseName}-${jar.version}.jar","app.jar")
entryPoint(["java","-Djava.security.egd=file:/dev/./urandom","-jar",'app.jar'])
exposePort(8022)
doFirst {
copy {
from jar
into stageDir
}
}
}
其中 applicationName和 tagVersion配置了插件生成镜像名称和 tag 的信息,默认插件配置为tag = "${project.group}/${applicationName}:${tagVersion}"
,也可以自己指定固定值。
以上的 task 等同于Dockerfile
:
FROM frolvlad/alpine-oraclejdk8:slim
VOLUME /tmp
ADD spring-boot-docker-1.2.3.jar app.jar
ENTRYPOINT [ "java", "-Djava.security.egd=file:/dev/./urandom","-jar","app.jar" ]
EXPOSE 8022
一个基础的 Spring-Boot 生成 docker 镜像的配置。
- 在 task 中使用已有的
Dockerfile
如果觉的在 task 中编写Dockerfile
替换脚本非常别扭,也可以直接在 task中指定Dockfile
的文件路径,直接使用已有的文件来生成镜像:
task buildDocker(type: Docker) {
applicationName = jar.baseName
tagVersion = jar.version
dockerfile = file('Dockerfile')
doFirst {
copy {
from jar
into stageDir
}
}
}
指定task 使用位于项目根目录的Dockerfile
来生产镜像。
5.编译并构建 Spring-Boot 项目的 Docker 镜像
控制台中执行命令:./gradlew clean build dockerBuilder --info
等待出现BUILD SUCCESSFUL
就证明编译成功了。
使用docker images
命令可以看到新生成了一个名为my-group/spring-boot-docker
,tag 是1.2.3
的镜像。
6. 其他用法
gradle-docker
插件还提供了配置仓库地址、配置使用 Docker Remote Api 和 Docker Hub等用法,可以参考该项目的 GitHub 地址来进行配置使用:
https://github.com/Transmode/gradle-docker