SpringBootアプリのDockerイメージをGradleでビルドしてプッシュ

Mavenではやったことあるけど、Gradleでやったことないなーって思って、ここを見ながらやったらすぐできるかな?と思ったけど、いつも通りなんか色々気になって結局うろうろ見て回ってしまった。

spring.io

今回使ったソース

github.com

違うとこ

  • DockerfileにJAVA_OPTSを足しといた
  • gradle-dockerの最新バージョン(0.19.2)を使っといた

結構色々見て回った気がしたけど、こう書いてみるとたいしたことしてないな。

DockerfileにJAVA_OPTSを足しといた

Gradle全然関係ないか。。。

Dockerfileどこに置くん?ってなったけどサンプルコード(https://github.com/spring-guides/gs-spring-boot-docker/tree/master/complete)見たらリポジトリーのルートだった。まぁ、そこがプラグインのデフォルトってだけなので、設定で場所を指定できるすね。

で、そのDockerfile:

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENTRYPOINT exec java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar

これで、起動時にJAVA_OPTS環境変数でごにょごにょ指定できる。でも、どうしてSpringの公式にはDockerfileでオプションを渡せるようにする方法が書いてないんだろう?別のいいやり方があるのかな?と思いながら、うろうろしてみたけど特に見つけられなかったや。

gradle-dockerの最新バージョン(0.19.2)を使っといた

dependsOn buildの部分で怒られるのなんだろうなー?と思いながら。プラグインリポジトリーを見に行って、README読みながら、こんな感じかなって思うのを書いた。結局その怒られる部分は削っといた。

GitHub - palantir/gradle-docker: a Gradle plugin for orchestrating docker builds and pushes.

SpringInitializrで生成されたやつに対して書き加えたのはこの辺:

buildscript {
  …
  repositories {
    maven {
      url "https://plugins.gradle.org/m2/"
    }
    …
  }
  dependencies {
    …
    classpath('gradle.plugin.com.palantir.gradle.docker:gradle-docker:0.19.2')
  }
}

…
apply plugin: 'com.palantir.docker'

…

ext {
  dockerImagePrefix = 'bufferings'
}

docker {
  name "${dockerImagePrefix}/${project.name}"
  files bootJar.archivePath
  buildArgs(['JAR_FILE': "${bootJar.archiveName}"])
}

なんとなくDockerHubのpush先のprefixにgroup使うよりは別の名前のがいいなって思ってdockerImagePrefixという名前の変数を作ってみた。extってこういう使い方でいいんかな?

ビルド

Dockerイメージのビルドは、こんな感じで

$ ./gradlew build docker

イメージが作られる。今回サンプルで作ったプロジェクトの名前はhello-bootだからそれがイメージのリポジトリー名に使われてる。

$ docker images
REPOSITORY                             TAG                 IMAGE ID            CREATED             SIZE
bufferings/hello-boot                  latest              6a1a102d8c30        42 minutes ago      119MB

プッシュ

DockerHubへのプッシュは、こんな感じで

$ ./gradlew dockerPush

pushされてた。docker loginしとかないとエラーになるすね。

https://hub.docker.com/r/bufferings/hello-boot/

ヽ(=´▽`=)ノ

あ、でも、違うんやで。今日はこれがやりたかったというわけじゃないんやで。まいっか、やりたかったことは、また次の機会に。