Alpine Linux에서 Jenkins의 자체 제작 Docker 이미지를 시작할 때 AWT 오류가 발생합니다.

경위



Dockerfile을 작성하지 않고 ansible 역할을 재사용할 수 없거나 시행착오 중입니다.
ansible-container 시도하거나
ansible Docker Connection Plugin1. 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

  • 이미지 레이어


  • alpine:3.5

  • shomatan/python:latest-alpine ansible 실행에 파이썬이 필요하기 때문에
  • shomatan/java:8-alpine
  • shomatan/jenkins:2.46.2-alpine

  • 도커 실행


    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 패키지 설치.

    끝에



    중요한 해결책은 한 줄에 거의 Packer + Docker + Ansible에 대해 언급했습니다.
    이제 Mac을 구축하고 대부분의 작업을 ansible로 할 정도의 ansible 주름이 되고 있습니다.
    Dockerfile을 쓰는 것에 넘어선 적은 없습니다만, shell예술을 배우기 위해서도 동기부족이 부족합니다.
    Packer+Docker+Ansible에서의 지식이 깊어지면 기사로 하려고 합니다.
    피드백 기다리고 있습니다!

    참고


  • AWT error while trying to build Jenkins Docker image based on Alpine
  • 좋은 웹페이지 즐겨찾기