読者です 読者をやめる 読者になる 読者になる

Packer で Chef な Docker に Dockerfile 重ねていきたいので Gradle その1

Gradle Docker

なにしろいま表題のような感じでいろいろ試してるんです。そうしたら、本当に38.9℃の熱を出して2日間寝込んでしまいました。

寝込んでいる間 Kindle Paperwhite で Manning の『 Gradle in Action 』を途中まで読みました。この作者の Benjamin Muschko さん、 Gradleware 社の方なんですが、なんと Docker のプラグインを書いています。

検索すると出てくるもう1本は build に特化したもので、 Muschko さんのは、うたい文句通り動けば Docker API の gradle クライアントです。ちなみに、僕のところではうたい文句通り動いていない部分があるので Groovy 勉強してパッチ見てもらいたいと思います…。

というわけで入れてみました。 Gradle 初めてなので、おかしなことやってるかもしれません。

Gradle のインストール

バイナリを落としてきて、 /opt/gradle に置いて、 /opt/gradle/bin/gradle に /usr/bin/gradle から ln -s しました。手癖です。

Docker デーモンが tcp 聞くように

Muschko さんのプラグインは Java の Docker API クライアントを使ってるんですが、こいつがまた tcp でしか Docker デーモンと話さないので、 /etc/init.d/docker 開けて、立ち上げてるところで

nohup $exec -d -H tcp://127.0.0.1:5555 -H unix:///var/run/docker.sock $other_args &>> $logfile &

しました。

build.gradle

repositories {
  mavenCentral()
}

buildscript {
  repositories {
    jcenter()
  }

  dependencies {
    classpath 'org.gradle.api.plugins:gradle-docker-plugin:0.2'
  }
}

apply plugin: 'docker'

import org.gradle.api.plugins.docker.tasks.*
import org.gradle.api.plugins.docker.tasks.container.*
import org.gradle.api.plugins.docker.tasks.image.*

docker {
  serverUrl = 'http://127.0.0.1:5555'
}

task info(type: DockerInfo)

次に build.gradle 書きました。一旦ちゃんと動くのか確かめたかったので info を試します。 root のスコープにも repositories 書いてるのは、 gradle-docker-plugin が依存している Docker API Java クライアントを落としてくる用。 serverUrl は http であっております。

$ gradle info
:info
Retrieving Docker info.
Debug                : false
Containers           : 0
Driver               : devicemapper
...

Docker Hub

次にプライベートなイメージを pull とか push とかしたいと思いましたがもう記憶に無いですがログインしろよとか出た気がします。 docker -H :5555 login します。 $HOME/.dockercfg が出来ます。ちなみに上の設定だと socket 経由なら sudo しますよね。もし万が一自分しかユーザのいないホストなら… sudo docker login もしておくとはまらないがちですが、やらないほうが良さそうです。

次に、ここがなんかアホな話なんですが、 Java クライアントが $HOME/.docker.io.properties を作れというので作ります。中身は Docker Hub のアカウント情報です。生パスワード様ご登場なので chmod 600 です。

docker.io.username=oogatta
docker.io.password=unko
docker.io.email=oogatta@gmail.com

これで理論上 pull と push ができますが、ちなみに、自分のところでは push は出来ても pull 失敗します。一見成功してるように見えるんですが、 /var/log/docker 見ると失敗してます。同じ状態で docker -H :5555 pull したら成功するので、 API 経由だと失敗するみたい。 Docker デーモンを -D で起動してログ見ると、全く同じリクエストを Docker Hub に飛ばして、 API からのだけこけているという。良い感じですね。

そもそも Docker Gradle プラグインが依存している Java クライアントのバージョンが古いので、つぶされてないバグがありそうです。この辺は気づいた人がつぶそうって感じでしょうか。ちなみに pull / push はそれぞれ

task pull(type: DockerPullImage) {
  imageId = 'oogatta/kidoibuki'
}

task push(type: DockerPushImage) {
  imageId = 'oogatta/kidoibuki'
}

こんな感じです簡単です。設定できる項目はプラグインのソース見るのが早そうです。

そうそうあと、最後になってしまったんですが、僕のところでは build も動かないんですよね…。これも一見通ってるんですが、 write tcp 172.31.2.33:46951: connection reset by peer みたいな感じです。なんか API クライアントのせいっぽいですね。

まあそんな感じでぐだぐだなんですが、 gradle の依存設定便利だし groovy 読みやすいし berkshelf なんかも一緒に出来たし得たこともありました。が、思ったより長くなってもう寝る時間なので続きは明日。