dockerdocker-composecoldfusioncfmllucee

Docker-Compose with Commandbox cannot change web root


I'm using docker-compose to launch a commandbox lucee container and a mysql contianer.

I'd like to change the web root of the lucee server, to keep all my non-public files hidden (server.json etc, cfmigrations resources folder)

I've followed the docs and updated my server.json https://commandbox.ortusbooks.com/embedded-server/server.json/packaging-your-server

{
    "web":{
        "webroot":"./public"
    }
}

If I launch the server from Windows (box start from the app folder), the server loads my index.cfm from ./public at http://localhost, perfect.

But using this .yaml file, the webroot doesn't change to ./public and the contents of my /app folder is shown, with the "public" folder visible in the directory listing.

services:
  db:
    image: mysql:8.0.26
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: $MYSQL_ROOT_PASSWORD
      MYSQL_DATABASE: cf
      MYSQL_USER: $MYSQL_USER
      MYSQL_PASSWORD: $MYSQL_PASSWORD
      MYSQL_SOURCE: $MYSQL_SOURCE
      MYSQL_SOURCE_USER: $MYSQL_SOURCE_USER
      MYSQL_SOURCE_PASSWORD: $MYSQL_SOURCE_PASSWORD
    volumes:
      - ./mysql:/var/lib/mysql
      - ./assets/initdb:/docker-entrypoint-initdb.d
      - ./assets/sql:/assets/sql

  web:
    depends_on:
      - db
    # Post 3.1.0 fails to boot if APP_DIR is set to non /app
    # image: ortussolutions/commandbox:lucee5-3.1.0
    image: ortussolutions/commandbox:lucee5
    # build: .
    ports:
      - "80:80"
      - "443:443"
    environment:
        - PORT=80
        - SSL_PORT=443
        - BOX_SERVER_WEB_SSL_ENABLE=true
        - BOX_SERVER_WEB_DIRECTORYBROWSING=$CF_DIRECTORY_BROWSING
        - BOX_INSTALL=true
        - BOX_SERVER_WEB_BLOCKCFADMIN=$CF_BLOCK_ADMIN
        - BOX_SERVER_CFCONFIGFILE=/app/.cfconfig.json 
        
        # - APP_DIR=/app/public
        # - BOX_SERVER_WEB_WEBROOT=/app/public
        
        - cfconfig_robustExceptionEnabled=$CF_ROBOUST_EXCEPTION_ENABLED
        - cfconfig_adminPassword=$CF_ADMIN_PASSWORD

        - MYSQL_USER=$MYSQL_USER
        - MYSQL_PASSWORD=$MYSQL_PASSWORD
        - MYSQL_HOST=$MYSQL_HOST
        - MYSQL_PORT=$MYSQL_PORT
    volumes:
      - ./app:/app
      - ./assets/mysql-connector-java-8.0.26.jar:/usr/local/lib/CommandBox/lib/mysql-connector-java-8.0.26.jar

Here's the directory listing:

directory listing of /app folder

This is my project structure:

project structure

It seems like the server.json file is being ignored or at least the web.webroot property, but I've tried both of these settings, and neither solve the problem

- APP_DIR=/app/public
- BOX_SERVER_WEB_WEBROOT=/app/public

The commandbox docs suggest changing APP_DIR to fix the web root, "APP_DIR - Application directory (web root)." https://hub.docker.com/r/ortussolutions/commandbox/

But if I do that, I get an error about the startup script being in the wrong place, which to me looks like it should be fixed: https://github.com/Ortus-Solutions/docker-commandbox/issues/55

The BOX_SERVER_WEB_WEBROOT is in the same way server.json is (or at least that property). I've tried setting the following env vars as well (both upper and lower case) and it makes no diffence, but bear in mind server.json changes the webroot for me whe

The output as the web container starts up:

Set verboseErrors = true

INFO: CF Engine defined as lucee@5.3.8+189

INFO: Convention .cfconfig.json found at /app/.cfconfig.json

INFO: Server Home Directory set to: /usr/local/lib/serverHome

 √ | Installing ALL dependencies

   | √ | Installing package [forgebox:commandbox-cfconfig@1.6.3]

   | √ | Installing package [forgebox:commandbox-migrations@3.2.3]

   |   | √ | Installing package [forgebox:cfmigrations@^2.0.0]

   |   |   | √ | Installing package [forgebox:qb@^8.0.0]

   |   |   |   | √ | Installing package [forgebox:cbpaginator@^2.4.0]

+ [[ -n '' ]]

+ [[ -n '' ]]

INFO: Generating server startup script

 √ | Starting Server

   |------------------------------

   | start server in - /app/

   | server name - app

   | server config file - /app//server.json

   | WAR/zip archive already installed.

   | Found CFConfig JSON in ".cfconfig.json" file in web root by convention

   | .

   | Importing luceeserver config from [/app/.cfconfig.json]

   | Config transferred!

   | Setting OS environment variable [cfconfig_adminPassword] into luceeser

   | ver

   | [adminPassword] set.

   | Setting OS environment variable [cfconfig_robustExceptionEnabled] into

   |  luceeserver

   | [robustExceptionEnabled] set.

   | Start script for shell [bash] generated at: /app/server-start.sh

   | Server start command: 

   |     /opt/java/openjdk/bin/java 

   |     -jar /usr/local/lib/CommandBox/lib/runwar-4.5.1.jar 

   |     --background=false 

   |     --host 0.0.0.0 

   |     --stop-port 42777 

   |     --processname app [lucee 5.3.8+189] 

   |     --log-dir /usr/local/lib/serverHome//logs 

   |     --server-name app 

   |     --tray-enable false 

   |     --dock-enable true 

   |     --directoryindex true 

   |     --timeout 240 

   |     --proxy-peeraddress true 

   |     --cookie-secure false 

   |     --cookie-httponly false 

   |     --pid-file /usr/local/lib/serverHome//.pid.txt 

   |     --gzip-enable true 

   |     --cfengine-name lucee 

   |     -war /app/ 

   |     --web-xml-path /usr/local/lib/serverHome/WEB-INF/web.xml 

   |     --http-enable true 

   |     --ssl-enable true 

   |     --ajp-enable false 

   |     --http2-enable true 

   |     --open-browser false 

   |     --open-url https://0.0.0.0:443 

   |     --port 80 

   |     --ssl-port 443 

   |     --urlrewrite-enable false 

   |     --predicate-file /usr/local/lib/serverHome//.predicateFile.txt

   | Dry run specified, exiting without starting server.

   |------------------------------

   | √ | Setting Server Profile to [production]

   |   |-----------------------------------------------------

   |   | Profile set from secure by default

   |   | Block CF Admin disabled

   |   | Block Sensitive Paths enabled

   |   | Block Flash Remoting enabled

   |   | Directory Browsing enabled

   |   |-----------------------------------------------------

INFO: Starting server using generated script: /usr/local/bin/startup.sh

[INFO ] runwar.server: Starting RunWAR 4.5.1

[INFO ] runwar.server: HTTP2 Enabled:true

[INFO ] runwar.server: Enabling SSL protocol on port 443

[INFO ] runwar.server: HTTP ajpEnable:false

[INFO ] runwar.server: HTTP warFile exists:true

[INFO ] runwar.server: HTTP warFile isDirectory:true

[INFO ] runwar.server: HTTP background:false

[INFO ] runwar.server: Adding additional lib dir of: /usr/local/lib/serverHome/WEB-INF/lib

[INFO ] runwar.server: ******************************************************************************

[INFO ] runwar.server: Starting - port:80 stop-port:42777 warpath:file:/app/

[INFO ] runwar.server: context: /  -  version: 4.5.1

[INFO ] runwar.server: web-dirs: ["\/app"]

[INFO ] runwar.server: Log Directory: /usr/local/lib/serverHome/logs

[INFO ] runwar.server: ******************************************************************************

[INFO ] runwar.server: XNIO-Option CONNECTION_LOW_WATER:1000000

[INFO ] runwar.server: XNIO-Option CORK:true

[INFO ] runwar.server: XNIO-Option WORKER_TASK_MAX_THREADS:30

[INFO ] runwar.server: XNIO-Option WORKER_IO_THREADS:8

[INFO ] runwar.server: XNIO-Option TCP_NODELAY:true

[INFO ] runwar.server: XNIO-Option WORKER_TASK_CORE_THREADS:30

[INFO ] runwar.server: XNIO-Option CONNECTION_HIGH_WATER:1000000

[INFO ] runwar.config: Parsing '/usr/local/lib/serverHome/WEB-INF/web.xml'

[INFO ] runwar.server: Extensions allowed by the default servlet for static files: 3gp,3gpp,7z,ai,aif,aiff,asf,asx,atom,au,avi,bin,bmp,btm,cco,crt,css,csv,deb,der,dmg,doc,docx,eot,eps,flv,font,gif,hqx,htc,htm,html,ico,img,ini,iso,jad,jng,jnlp,jpeg,jpg,js,json,kar,kml,kmz,m3u8,m4a,m4v,map,mid,midi,mml,mng,mov,mp3,mp4,mpeg,mpeg4,mpg,msi,msm,msp,ogg,otf,pdb,pdf,pem,pl,pm,png,ppt,pptx,prc,ps,psd,ra,rar,rpm,rss,rtf,run,sea,shtml,sit,svg,svgz,swf,tar,tcl,tif,tiff,tk,ts,ttf,txt,wav,wbmp,webm,webp,wmf,wml,wmlc,wmv,woff,woff2,xhtml,xls,xlsx,xml,xpi,xspf,zip,aifc,aac,apk,bak,bk,bz2,cdr,cmx,dat,dtd,eml,fla,gz,gzip,ipa,ia,indd,hey,lz,maf,markdown,md,mkv,mp1,mp2,mpe,odt,ott,odg,odf,ots,pps,pot,pmd,pub,raw,sdd,tsv,xcf,yml,yaml

[INFO ] runwar.server: welcome pages in deployment manager: [index.cfm, index.lucee, index.html, index.htm]

WARNING: An illegal reflective access operation has occurred

WARNING: Illegal reflective access by org.apache.felix.framework.ext.ClassPathExtenderFactory$DefaultClassLoaderExtender (file:/usr/local/lib/serverHome/WEB-INF/lib/lucee.jar) to method java.net.URLClassLoader.addURL(java.net.URL)

WARNING: Please consider reporting this to the maintainers of org.apache.felix.framework.ext.ClassPathExtenderFactory$DefaultClassLoaderExtender

WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations

WARNING: All illegal access operations will be denied in a future release

[INFO ] runwar.server: Direct Buffers: true

[INFO ] runwar.server: ******************************************************************************

[INFO ] runwar.server: *** starting 'stop' listener thread - Host: 0.0.0.0 - Socket: 42777

[INFO ] runwar.server: ******************************************************************************

[INFO ] runwar.server: Server is up - http-port:80 https-port:443 stop-port:42777 PID:286 version 4.5.1

This is all fairly new to me so I might have done something completely wrong, I'm wondering if it's a problem with the folder nesting, although I've tried rearranging it and can't come up with a working solution.


Solution

  • You're using a pre-warmed image

    image: ortussolutions/commandbox:lucee5
    

    That means the server has already been started and "locked in" to all its settings, including the web root. Use the vanilla commandbox image that has never had a server started, that way when you warm up the image, you'll be starting it with your settings the first time.

    To set a custom web root, you'll want to add this to your docker file

    ENV APP_DIR=/app/public