Sonarqube and LDAP integration with Docker

Hi,
I’m trying to integrate LDAP with sonarqube 7.8 community edition but getting following error.

2019.07.23 14:44:04 INFO  web[][o.s.s.a.EmbeddedTomcat] HTTP connector enabled on port 9000
2019.07.23 14:44:05 INFO  web[][o.s.s.p.UpdateCenterClient] Update center: https://update.sonarsource.org/update-center.properties (no proxy)
2019.07.23 14:44:05 ERROR web[][o.s.s.p.Platform] Background initialization failed. Stopping SonarQube
java.lang.IllegalStateException: Unable to load component class org.sonar.server.platform.ws.SystemWs
        at org.sonar.core.platform.ComponentContainer$ExtendedDefaultPicoContainer.getComponent(ComponentContainer.java:65)
        at org.picocontainer.DefaultPicoContainer.getComponent(DefaultPicoContainer.java:621)
        at org.picocontainer.parameters.CollectionComponentParameter.getArrayInstance(CollectionComponentParameter.java:334)
        at org.picocontainer.parameters.CollectionComponentParameter.access$100(CollectionComponentParameter.java:49)
        at org.picocontainer.parameters.CollectionComponentParameter$1.resolveInstance(CollectionComponentParameter.java:139)
        at org.picocontainer.parameters.ComponentParameter$1.resolveInstance(ComponentParameter.java:141)
        at org.picocontainer.injectors.SingleMemberInjector.getParameter(SingleMemberInjector.java:78)
        at org.picocontainer.injectors.ConstructorInjector$CtorAndAdapters.getParameterArguments(ConstructorInjector.java:309)
        at org.picocontainer.injectors.ConstructorInjector$1.run(ConstructorInjector.java:335)
        at org.picocontainer.injectors.AbstractInjector$ThreadLocalCyclicDependencyGuard.observe(AbstractInjector.java:270)
        at org.picocontainer.injectors.ConstructorInjector.getComponentInstance(ConstructorInjector.java:364)
        at org.picocontainer.injectors.AbstractInjectionFactory$LifecycleAdapter.getComponentInstance(AbstractInjectionFactory.java:56)
        at org.picocontainer.behaviors.AbstractBehavior.getComponentInstance(AbstractBehavior.java:64)
        at org.picocontainer.behaviors.Stored.getComponentInstance(Stored.java:91)
        at org.picocontainer.DefaultPicoContainer.instantiateComponentAsIsStartable(DefaultPicoContainer.java:1034)
        at org.picocontainer.DefaultPicoContainer.addAdapterIfStartable(DefaultPicoContainer.java:1026)
        at org.picocontainer.DefaultPicoContainer.startAdapters(DefaultPicoContainer.java:1003)
        at org.picocontainer.DefaultPicoContainer.start(DefaultPicoContainer.java:767)
        at org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:135)
        at org.sonar.server.platform.platformlevel.PlatformLevel.start(PlatformLevel.java:90)
        at org.sonar.server.platform.platformlevel.PlatformLevel4.start(PlatformLevel4.java:561)
        at org.sonar.server.platform.Platform.start(Platform.java:211)
        at org.sonar.server.platform.Platform.startLevel34Containers(Platform.java:185)
        at org.sonar.server.platform.Platform.access$500(Platform.java:46)
        at org.sonar.server.platform.Platform$1.lambda$doRun$0(Platform.java:119)
        at org.sonar.server.platform.Platform$AutoStarterRunnable.runIfNotAborted(Platform.java:371)
        at org.sonar.server.platform.Platform$1.doRun(Platform.java:119)
        at org.sonar.server.platform.Platform$AutoStarterRunnable.run(Platform.java:355)
        at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.IllegalStateException: Unable to load component class org.sonar.server.platform.ws.InfoAction
        at org.sonar.core.platform.ComponentContainer$ExtendedDefaultPicoContainer.getComponent(ComponentContainer.java:65)
        at org.picocontainer.DefaultPicoContainer.getComponent(DefaultPicoContainer.java:621)
        at org.picocontainer.parameters.CollectionComponentParameter.getArrayInstance(CollectionComponentParameter.java:334)
        at org.picocontainer.parameters.CollectionComponentParameter.access$100(CollectionComponentParameter.java:49)
        at org.picocontainer.parameters.CollectionComponentParameter$1.resolveInstance(CollectionComponentParameter.java:139)
        at org.picocontainer.parameters.ComponentParameter$1.resolveInstance(ComponentParameter.java:141)
        at org.picocontainer.injectors.SingleMemberInjector.getParameter(SingleMemberInjector.java:78)
        at org.picocontainer.injectors.ConstructorInjector$CtorAndAdapters.getParameterArguments(ConstructorInjector.java:309)
        at org.picocontainer.injectors.ConstructorInjector$1.run(ConstructorInjector.java:335)
        at org.picocontainer.injectors.AbstractInjector$ThreadLocalCyclicDependencyGuard.observe(AbstractInjector.java:270)
        at org.picocontainer.injectors.ConstructorInjector.getComponentInstance(ConstructorInjector.java:364)
        at org.picocontainer.injectors.AbstractInjectionFactory$LifecycleAdapter.getComponentInstance(AbstractInjectionFactory.java:56)
        at org.picocontainer.behaviors.AbstractBehavior.getComponentInstance(AbstractBehavior.java:64)
        at org.picocontainer.behaviors.Stored.getComponentInstance(Stored.java:91)
        at org.picocontainer.DefaultPicoContainer.getInstance(DefaultPicoContainer.java:699)
        at org.picocontainer.DefaultPicoContainer.getComponent(DefaultPicoContainer.java:647)
        at org.sonar.core.platform.ComponentContainer$ExtendedDefaultPicoContainer.getComponent(ComponentContainer.java:63)
        ... 28 common frames omitted
Caused by: java.lang.IllegalStateException: Unable to load component class org.sonar.server.platform.ws.StandaloneSystemInfoWriter
        at org.sonar.core.platform.ComponentContainer$ExtendedDefaultPicoContainer.getComponent(ComponentContainer.java:65)
        at org.picocontainer.DefaultPicoContainer.getComponent(DefaultPicoContainer.java:632)
        at org.picocontainer.parameters.BasicComponentParameter$1.resolveInstance(BasicComponentParameter.java:118)
        at org.picocontainer.parameters.ComponentParameter$1.resolveInstance(ComponentParameter.java:136)
        at org.picocontainer.injectors.SingleMemberInjector.getParameter(SingleMemberInjector.java:78)
        at org.picocontainer.injectors.ConstructorInjector$CtorAndAdapters.getParameterArguments(ConstructorInjector.java:309)
        at org.picocontainer.injectors.ConstructorInjector$1.run(ConstructorInjector.java:335)
        at org.picocontainer.injectors.AbstractInjector$ThreadLocalCyclicDependencyGuard.observe(AbstractInjector.java:270)
        at org.picocontainer.injectors.ConstructorInjector.getComponentInstance(ConstructorInjector.java:364)
        at org.picocontainer.injectors.AbstractInjectionFactory$LifecycleAdapter.getComponentInstance(AbstractInjectionFactory.java:56)
        at org.picocontainer.behaviors.AbstractBehavior.getComponentInstance(AbstractBehavior.java:64)
        at org.picocontainer.behaviors.Stored.getComponentInstance(Stored.java:91)
        at org.picocontainer.DefaultPicoContainer.getInstance(DefaultPicoContainer.java:699)
        at org.picocontainer.DefaultPicoContainer.getComponent(DefaultPicoContainer.java:647)
        at org.sonar.core.platform.ComponentContainer$ExtendedDefaultPicoContainer.getComponent(ComponentContainer.java:63)
        ... 44 common frames omitted
Caused by: java.lang.IllegalStateException: Unable to load component class org.sonar.server.platform.monitoring.StandaloneSystemSection
        at org.sonar.core.platform.ComponentContainer$ExtendedDefaultPicoContainer.getComponent(ComponentContainer.java:65)
        at org.picocontainer.DefaultPicoContainer.getComponent(DefaultPicoContainer.java:621)
        at org.picocontainer.parameters.CollectionComponentParameter.getArrayInstance(CollectionComponentParameter.java:334)
        at org.picocontainer.parameters.CollectionComponentParameter.access$100(CollectionComponentParameter.java:49)
        at org.picocontainer.parameters.CollectionComponentParameter$1.resolveInstance(CollectionComponentParameter.java:139)
        at org.picocontainer.parameters.ComponentParameter$1.resolveInstance(ComponentParameter.java:141)
        at org.picocontainer.injectors.SingleMemberInjector.getParameter(SingleMemberInjector.java:78)
        at org.picocontainer.injectors.ConstructorInjector$CtorAndAdapters.getParameterArguments(ConstructorInjector.java:309)
        at org.picocontainer.injectors.ConstructorInjector$1.run(ConstructorInjector.java:335)
        at org.picocontainer.injectors.AbstractInjector$ThreadLocalCyclicDependencyGuard.observe(AbstractInjector.java:270)
        at org.picocontainer.injectors.ConstructorInjector.getComponentInstance(ConstructorInjector.java:364)
        at org.picocontainer.injectors.AbstractInjectionFactory$LifecycleAdapter.getComponentInstance(AbstractInjectionFactory.java:56)
        at org.picocontainer.behaviors.AbstractBehavior.getComponentInstance(AbstractBehavior.java:64)
        at org.picocontainer.behaviors.Stored.getComponentInstance(Stored.java:91)
        at org.picocontainer.DefaultPicoContainer.getInstance(DefaultPicoContainer.java:699)
        at org.picocontainer.DefaultPicoContainer.getComponent(DefaultPicoContainer.java:647)
        at org.sonar.core.platform.ComponentContainer$ExtendedDefaultPicoContainer.getComponent(ComponentContainer.java:63)
        ... 58 common frames omitted
Caused by: java.lang.IllegalStateException: Unable to load component class org.sonar.server.user.SecurityRealmFactory
        at org.sonar.core.platform.ComponentContainer$ExtendedDefaultPicoContainer.getComponent(ComponentContainer.java:65)
        at org.picocontainer.DefaultPicoContainer.getComponent(DefaultPicoContainer.java:632)
        at org.picocontainer.parameters.BasicComponentParameter$1.resolveInstance(BasicComponentParameter.java:118)
        at org.picocontainer.parameters.ComponentParameter$1.resolveInstance(ComponentParameter.java:136)
        at org.picocontainer.injectors.SingleMemberInjector.getParameter(SingleMemberInjector.java:78)
        at org.picocontainer.injectors.ConstructorInjector$CtorAndAdapters.getParameterArguments(ConstructorInjector.java:309)
        at org.picocontainer.injectors.ConstructorInjector$1.run(ConstructorInjector.java:335)
        at org.picocontainer.injectors.AbstractInjector$ThreadLocalCyclicDependencyGuard.observe(AbstractInjector.java:270)
        at org.picocontainer.injectors.ConstructorInjector.getComponentInstance(ConstructorInjector.java:364)
        at org.picocontainer.injectors.AbstractInjectionFactory$LifecycleAdapter.getComponentInstance(AbstractInjectionFactory.java:56)
        at org.picocontainer.behaviors.AbstractBehavior.getComponentInstance(AbstractBehavior.java:64)
        at org.picocontainer.behaviors.Stored.getComponentInstance(Stored.java:91)
        at org.picocontainer.DefaultPicoContainer.getInstance(DefaultPicoContainer.java:699)
        at org.picocontainer.DefaultPicoContainer.getComponent(DefaultPicoContainer.java:647)
        at org.sonar.core.platform.ComponentContainer$ExtendedDefaultPicoContainer.getComponent(ComponentContainer.java:63)
        ... 74 common frames omitted
Caused by: org.sonar.api.utils.SonarException: Realm 'LDAP' not found. Please check the property 'sonar.security.realm' in conf/sonar.properties
        at org.sonar.server.user.SecurityRealmFactory.<init>(SecurityRealmFactory.java:54)
        at org.sonar.server.user.SecurityRealmFactory.<init>(SecurityRealmFactory.java:78)
        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 org.picocontainer.injectors.AbstractInjector.newInstance(AbstractInjector.java:145)
        at org.picocontainer.injectors.ConstructorInjector$1.run(ConstructorInjector.java:342)
        at org.picocontainer.injectors.AbstractInjector$ThreadLocalCyclicDependencyGuard.observe(AbstractInjector.java:270)
        at org.picocontainer.injectors.ConstructorInjector.getComponentInstance(ConstructorInjector.java:364)
        at org.picocontainer.injectors.AbstractInjectionFactory$LifecycleAdapter.getComponentInstance(AbstractInjectionFactory.java:56)
        at org.picocontainer.behaviors.AbstractBehavior.getComponentInstance(AbstractBehavior.java:64)
        at org.picocontainer.behaviors.Stored.getComponentInstance(Stored.java:91)
        at org.picocontainer.DefaultPicoContainer.getInstance(DefaultPicoContainer.java:699)
        at org.picocontainer.DefaultPicoContainer.getComponent(DefaultPicoContainer.java:647)
        at org.sonar.core.platform.ComponentContainer$ExtendedDefaultPicoContainer.getComponent(ComponentContainer.java:63)
        ... 88 common frames omitted
2019.07.23 14:44:06 INFO  web[][o.s.p.ProcessEntryPoint] Hard stopping process
2019.07.23 14:44:06 INFO  app[][o.s.a.SchedulerImpl] Process[web] is stopped
2019.07.23 14:44:06 INFO  app[][o.s.a.SchedulerImpl] Process[es] is stopped
2019.07.23 14:44:06 WARN  app[][o.s.a.p.AbstractManagedProcess] Process exited with exit value [es]: 143
2019.07.23 14:44:06 INFO  app[][o.s.a.SchedulerImpl] SonarQube is stopped

Hi,

The error in your log

Caused by: org.sonar.api.utils.SonarException: Realm 'LDAP' not found. Please check the property 'sonar.security.realm' in conf/sonar.properties

Indicates a problem with your LDAP configuration. Does sonar.security.realm appear to you to be correctly configured?

 
Ann

Thanks for the reply. I was able to debug the issue further and noticed that ldap plugin is not available inside my plugins directory.
I’m usinf a Dockerfile to build a custom sonarqube image where in i copy the ldap plugin into the plugin directory but still i don’t see the ldap plugin.
Can somebody help on this?

1 Like

Hi Jainesh, I am facing the similar issue and see the plugins not being populated there in the expected path. could you please help me that how did you resolve this issue.

Hi,
How are you starting the image? Can you post your configuration?

Hi @Michal_Duda Michal, we are using docker-compose.yml file to deploy the container and using the version 7.9.2-community.

getting the below error:
Caused by: org.sonar.api.utils.SonarException: Realm ‘LDAP’ not found. Please check the property ‘sonar.security.realm’ in conf/sonar.properties.

my docker-compoe file is

Ansible managed

version: ‘2’
services:
sonarqube:
image: sonarqube:7.9.2-community
container_name: “sonarqube”
networks:
- sonarqube
volumes:
- “/opt/tools/sonarqube/conf/sonar.properties:/opt/sonarqube/conf/sonar.properties”
- “/opt/tools/sonarqube/logs:/logs”
- “/opt/tools/sonarqube/data:/opt/sonarqube/data”
- “/opt/tools/sonarqube/bin/run.sh:/opt/sonarqube/bin/run.sh”
- “/opt/tools/sonarqube/extensions:/opt/sonarqube/extensions”

    ports:
      - 9000:9000
    restart: always
    ulimits:
      nofile:
        soft: 262144
        hard: 262144
    environment:
      http_proxy: "http://domain.net:2010"
      https_proxy: "http://domain.net:2010"
      
    logging:
      driver: json-file

networks:
sonarqube:
driver: bridge

Is /opt/tools/sonarqube/extensions empty on the host? If that’s the case then you will need to initialize this directory with the plugins from your SonarQube edition, SonarQube won’t do that automatically for you. We recommend to use docker volumes instead of binding directories on the host- in that case Docker will initialize the volume for you. Here is a modified compose file that does that:

version: '2'
services:
  sonarqube:
    image: sonarqube:7.9.2-community
    container_name: "sonarqube"
    networks:
      - sonarqube
    volumes:
      # - "/opt/tools/sonarqube/conf/sonar.properties:/opt/sonarqube/conf/sonar.properties"
      # - "/opt/tools/sonarqube/logs:/logs"
      # - "/opt/tools/sonarqube/data:/opt/sonarqube/data"
      # - "/opt/tools/sonarqube/bin/run.sh:/opt/sonarqube/bin/run.sh"
      - sonarqube_ext:/opt/sonarqube/extensions
    ports:
      - 9000:9000
    restart: always
    ulimits:
      nofile:
        soft: 262144
        hard: 262144
    environment:
      http_proxy: "http://domain.net:2010"
      https_proxy: "http://domain.net:2010"
    logging:
      driver: json-file
volumes:
  sonarqube_ext:
networks:
  sonarqube:
    driver: bridge

Thanks for the reply Michal, Yes the extensions dir is empty. I understood your point about initializing the dir however we are binding this directory as host:container so if I specify as you suggested like below

  - sonarqube_ext:/opt/sonarqube/extensions

do I need to specify sonarqube_ext somewhere as here this volumes seems empty

volumes:
sonarqube_ext:

shall i make it like

volumes:
sonarqube_ext: /data/sonarqube/extensions

?? should this work? Or a good approach?

If it’s a Docker volume (like in my example) and not a bind mount (like in your first config), you can leave it empty because on container startup Docker will initialize the volume and copy over all plugins from your SonarQube edition.