How to add module to Wildfly using CLI

I’m trying to create a Wildfly docker image with a postgres datasource.

When I build the dockerfile it always fails with Permission Denied when I try to install the postgres module.

  • In docker run, how to set multi-value in --ulimit
  • How to remove file/folder from Docker container without starting this container
  • docker-machine, docker-compose and google cloud
  • How to use docker run with a Meteor image?
  • Two apt-get arguments to a docker run command doesn't work
  • cannot connect to docker on RemoteServer using Ansible
  • My dockerfile looks look this:

    FROM wildflyext/wildfly-camel
    
    RUN /opt/jboss/wildfly/bin/add-user.sh admin admin --silent
    ADD postgresql-9.4-1201.jdbc41.jar /tmp/
    ADD config.sh /tmp/
    ADD batch.cli /tmp/
    RUN /tmp/config.sh
    

    Which calls the following:

    #!/bin/bash
    
    JBOSS_HOME=/opt/jboss/wildfly
    JBOSS_CLI=$JBOSS_HOME/bin/jboss-cli.sh
    JBOSS_MODE=${1:-"standalone"}
    JBOSS_CONFIG=${2:-"$JBOSS_MODE.xml"}
    
    function wait_for_wildfly() {
      until `$JBOSS_CLI -c "ls /deployment" &> /dev/null`; do
        sleep 10
      done
    }
    
    echo "==> Starting WildFly..."
    $JBOSS_HOME/bin/$JBOSS_MODE.sh -c $JBOSS_CONFIG > /dev/null &
    
    echo "==> Waiting..."
    wait_for_wildfly
    
    echo "==> Executing..."
    $JBOSS_CLI -c --file=`dirname "$0"`/batch.cli  --connect
    
    echo "==> Shutting down WildFly..."
    if [ "$JBOSS_MODE" = "standalone" ]; then
      $JBOSS_CLI -c ":shutdown"
    else
      $JBOSS_CLI -c "/host=*:shutdown"
    fi
    

    And

    batch
    
    module add --name=org.postgresql --resources=/tmp/postgresql-9.4-1201.jdbc41.jar --dependencies=javax.api,javax.transaction.api
    /subsystem=datasources/jdbc-driver=postgresql:add(driver-name=postgresql,driver-module-name=org.postgresql,driver-xa-datasource-class-name=org.postgresql.xa.PGXADataSource)
    
    run-batch
    

    The output when building is:

    ==> Starting WildFly…
    ==> Waiting…
    ==> Executing… Failed to locate the file on the filesystem copying /tmp/postgresql-9.4-1201.jdbc41.jar to
    /opt/jboss/wildfly/modules/org/postgresql/main/postgresql-9.4-1201.jdbc41.jar:
    /tmp/postgresql-9.4-1201.jdbc41.jar (Permission denied)

    What permissions are required, and where do I set the permission(s)?

    Thanks

  • Docker: Npm install very slow in Ubuntu host
  • Openstack Nova docker implement security group
  • Docker with WebHDFS
  • Where can I create images from? Locally at all? (Docker remote API)
  • Docker Data Volume Container - Can I share across swarm
  • JHipster docker image from DockerHub is not working
  • 2 Solutions collect form web for “How to add module to Wildfly using CLI”

    It seems the JAR file is not readable by the jboss user (the user comming from parent image). The postgresql-9.4-1201.jdbc41.jar is added under the root user – find details in this GitHub discussion.

    You could

    • either add permissions to JAR file before adding it to the image
    • or add permissions to JAR file in the image after the adding
    • or change ownership of the file in the image

    The simplest solution could be the first one. The other 2 solutions need also switching user to root (USER root in dockerfile) and then back to jboss.

    Here a advice : make a cli file like this :

    connect
    module add --name=sqlserver.jdbc --resources=@INSTALL_FOLDER@/libext/jtds-1.3.1.jar --dependencies=javax.api,javax.transaction.api
    /subsystem=datasources/jdbc-driver=sqlserver:add(driver-module-name=sqlserver.jdbc,driver-name=sqlserver,driver-class-name=@JDBC_DRIVER@)
    /subsystem=datasources/data-source=@DATASOURCENAME@:add(jndi-name=java:jboss/@JNDI_NAME@,enabled="true",use-java-context="true",driver-name=sqlserver,connection-url="@JDBC_URL@",user-name=@JDBC_USER@,password=@JDBC_PASSWORD@,validate-on-match=true,background-validation=true)
    

    replace @VAR@ by our own value… and It should work!
    Be caution than JBOSS/Wildfly 10 think relatively for jar –resources by default but wildfly 8 think absolute path this could make you weird ! 😉

    cheers!

    Docker will be the best open platform for developers and sysadmins to build, ship, and run distributed applications.