5.3.10.3. Docker 的 Gradle 插件

本章节介绍使用 Gradle 构建和发布单一 UberJAR 的 Docker 镜像。

市面上有不少 Gradle 的 Docker 插件,这里使用 bmuschko/gradle-docker-plugin

build.gradle 文件中引入管理镜像必须的类并且添加 buildscript 依赖:

  1. buildscript {
  2. dependencies {
  3. classpath 'com.bmuschko:gradle-docker-plugin:X.Y.Z'
  4. }
  5. }
  6. import com.bmuschko.gradle.docker.tasks.image.Dockerfile
  7. import com.bmuschko.gradle.docker.tasks.image.DockerBuildImage
  8. import com.bmuschko.gradle.docker.tasks.image.DockerPushImage
  9. import com.bmuschko.gradle.docker.DockerRegistryCredentials

com.bmuschko.docker-remote-api 插件允许通过远程 API 跟 Docker 交互。可以通过插件提供的自定义任务创建任何能想到的工作流模型的强化任务。需要使用这个插件,在构建脚本添加以下代码片段:

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

Dockerfile 可以通过自定义的 Dockerfile 任务创建。Dockerfile 指令需要按照正确的顺序声明。

  1. task createDockerfile(type: Dockerfile, dependsOn: buildUberJar) {
  2. destFile = project.file('build/distributions/uberJar/Dockerfile')
  3. from 'openjdk:8'
  4. addFile("app.jar", "/usr/src/cuba-sales/app.jar")
  5. defaultCommand("java", "-Dapp.home=/usr/src/cuba-sales/home", "-jar", "/usr/src/cuba-sales/app.jar")
  6. }
  • from 属性添加了用来构建镜像的基础 Docker 镜像。

  • addFile 属性定义了将要被拷贝到镜像的 JAR 源文件的路径。注意,JAR 源文件需要跟 Dockerfile 在一个目录。

  • defaultCommand 定义了运行应用程序的命令。

拉取(pull)或者推送(push)镜像到 Docker Hub 仓库或者私有仓库可能会需要登录认证。可以通过 registryCredentials 闭包(closure)来提供用户名密码。在 gradle.properties 文件设置用户名密码:

  1. dockerHubEmail = 'example@email.com'
  2. dockerHubPassword = 'docker-hub-password'
  3. dockerHubUsername = 'docker-hub-username'

可以在构建脚本中访问项目属性,像使用变量一样用这些属性的名称即可:

  1. def dockerRegistryCredentials = new DockerRegistryCredentials()
  2. dockerRegistryCredentials.email = dockerHubEmail
  3. dockerRegistryCredentials.password = dockerHubPassword
  4. dockerRegistryCredentials.username = dockerHubUsername

定义如下两个任务,从 Dockerfile 创建一个 Docker 镜像,以及推送镜像至公共 Docker Hub 仓库:

  1. task buildImage(type: DockerBuildImage, dependsOn: createDockerfile) {
  2. inputDir = createDockerfile.destFile.parentFile
  3. tags = ['sample-sales', '{docker-hub-username}/{default-repo-folder-name}:sample-sales']
  4. registryCredentials = dockerRegistryCredentials
  5. }
  6. task pushImage(type: DockerPushImage, dependsOn: buildImage) {
  7. tag = 'sample-sales'
  8. imageName = '{docker-hub-username}/{default-repo-folder-name}'
  9. registryCredentials = dockerRegistryCredentials
  10. }

按照 单一 UberJAR 部署 章节的介绍配置单一 Uber JAR。然后执行 pushImage 任务,可以通过命令行终端执行。

  1. gradle pushImage

这个任务会构建 UberJAR,生成 Dockerfile,构建镜像然后推送这个镜像到 Docker Hub 仓库。