Alpine LinuxでJenkinsの自作Dockerイメージを起動した時にAWTエラーが発生する

# 経緯
Dockerfileを書かずにansibleロールを再利用できないか試行錯誤中です。
[ansible-container](https://docs.ansible.com/ansible-container/)を試したり、
ansibleの`Docker Connection Plugin`を使って
1. containerの作成
2. プロビジョニング
3. containerのコミット
4. containerの破棄
を一貫してansibleのplaybookで行ったりしましたがイマイチしっくりきません。
例：[OpenVPNサーバー](https://github.com/shomatan/docker-pritunl)

次の選択肢として[packer](https://www.packer.io/)を試しています。
題材としてAlpine LinuxをベースイメージにJenkinsを構築していたところ、`hudson.util.AWTProblem: java.lang.NullPointerException`が発生したので解決法を記します。

# 環境
## ホスト
macOS Sierra 10.12.4

- ansible 2.2.1.0
- docker 17.03.1-ce, build c6d412e
- packer 1.0.0

## イメージレイヤ
1. [alpine:3.5](https://hub.docker.com/_/alpine/)
2. [shomatan/python:latest-alpine](https://github.com/shomatan/docker-python.git) ansibleの実行でpythonが必要なため
3. [shomatan/java:8-alpine](https://github.com/shomatan/docker-java.git)
4. [shomatan/jenkins:2.46.2-alpine](https://github.com/shomatan/docker-jenkins.git)

# docker run
`docker run --rm -p 8080:8080 shomatan/jenkins:2.46.2-alpine`

エラー...

```
SEVERE: Failed to initialize Jenkins
hudson.util.AWTProblem: java.lang.NullPointerException
        at hudson.WebAppMain.contextInitialized(WebAppMain.java:191)
        at org.eclipse.jetty.server.handler.ContextHandler.callContextInitialized(ContextHandler.java:800)
        at org.eclipse.jetty.servlet.ServletContextHandler.callContextInitialized(ServletContextHandler.java:444)
        at org.eclipse.jetty.server.handler.ContextHandler.startContext(ContextHandler.java:791)
        at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:294)
        at org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1349)
        at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1342)
        at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:741)
        at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:505)
        at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
        at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:132)
        at org.eclipse.jetty.server.Server.start(Server.java:387)
        at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:114)
        at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:61)
        at org.eclipse.jetty.server.Server.doStart(Server.java:354)
        at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
        at winstone.Launcher.<init>(Launcher.java:152)
        at winstone.Launcher.main(Launcher.java:352)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at Main._main(Main.java:264)
        at Main.main(Main.java:112)
Caused by: java.lang.NullPointerException
        at sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264)
        at sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:219)
        at sun.awt.FontConfiguration.init(FontConfiguration.java:107)
        at sun.awt.X11FontManager.createFontConfiguration(X11FontManager.java:774)
        at sun.font.SunFontManager$2.run(SunFontManager.java:431)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.font.SunFontManager.<init>(SunFontManager.java:376)
        at sun.awt.FcFontManager.<init>(FcFontManager.java:35)
        at sun.awt.X11FontManager.<init>(X11FontManager.java:57)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at java.lang.Class.newInstance(Class.java:442)
        at sun.font.FontManagerFactory$1.run(FontManagerFactory.java:83)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.font.FontManagerFactory.getInstance(FontManagerFactory.java:74)
        at java.awt.Font.getFont2D(Font.java:491)
        at java.awt.Font.getFamily(Font.java:1220)
        at java.awt.Font.getFamily_NoClientCode(Font.java:1194)
        at java.awt.Font.getFamily(Font.java:1186)
        at java.awt.Font.toString(Font.java:1683)
        at hudson.util.ChartUtil.<clinit>(ChartUtil.java:260)
        at hudson.WebAppMain.contextInitialized(WebAppMain.java:190)
        ... 23 more

```

ブラウザでhttp://localhost:8080 を開くと
<img width="972" alt="Screen Shot 2017-04-26 at 14.08.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/122672/4214672e-a630-e13b-e004-7a51ba200476.png">

`ENTRYPOINT`には `["dumb-init", "java", "-Djava.awt.headless=true", "-jar", "/usr/share/jenkins/jenkins.war"]` と指定しています。

# 解決法
apkで`ttf-dejavu`パッケージをインストール。

# 終わりに
肝心な解決法は1行に、ほとんどPacker+Docker+Ansibleについて言及してしまいました。
今やMacの構築とほとんどの作業をansibleで行うほどのansible厨になっています。
Dockerfileを書くに越したことはないのですが、shell芸を学ぼうにもモチベーションが足りません。
Packer+Docker+Ansibleでの知見が深まったら記事にしようと思います。
フィードバックお待ちしています！

# 参考
- [AWT error while trying to build Jenkins Docker image based on Alpine](http://stackoverflow.com/questions/36269289/awt-error-while-trying-to-build-jenkins-docker-image-based-on-alpine)