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


経緯

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

次の選択肢としてpackerを試しています。
題材として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
  2. shomatan/python:latest-alpine ansibleの実行でpythonが必要なため
  3. shomatan/java:8-alpine
  4. shomatan/jenkins:2.46.2-alpine

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 を開くと

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での知見が深まったら記事にしようと思います。
フィードバックお待ちしています!

参考