带有 Commandbox 的 Docker-Compose 无法更改 Web 根目录

标签 docker docker-compose coldfusion cfml lucee

我正在使用 docker-compose 来启动一个命令框 lucee 容器和一个 mysql contianer。

我想更改 lucee 服务器的网络根目录,以隐藏我所有的非公开文件(server.json 等,cfmigrations 资源文件夹)

我已经按照文档更新了我的 server.json https://commandbox.ortusbooks.com/embedded-server/server.json/packaging-your-server

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

如果我从 Windows 启动服务器(box start 来自 app 文件夹),服务器会从位于 http://localhost 的 ./public 加载我的 index.cfm , 完美。

但是使用这个 .yaml 文件,webroot 不会更改为 ./public 而我的 /app 文件夹的内容是显示,“公共(public)”文件夹在目录列表中可见。

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

这是目录列表:

directory listing of /app folder

这是我的项目结构:

project structure

似乎 server.json 文件或至少 web.webroot 属性被忽略,但我已经尝试了这两种设置,但都没有解决问题

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

命令框文档建议更改 APP_DIR 以修复 Web 根目录,“APP_DIR - 应用程序目录(Web 根目录)”。 https://hub.docker.com/r/ortussolutions/commandbox/

但如果我这样做,我会收到有关启动脚本位于错误位置的错误,在我看来应该修复它: https://github.com/Ortus-Solutions/docker-commandbox/issues/55

BOX_SERVER_WEB_WEBROOTserver.json 的方式相同(或至少是该属性)。我也尝试设置以下环境变量(大写和小写)并且没有区别,但请记住 server.json 为我更改了 webroot

  • BOX_SERVER_WEB_WEBROOT=./public
  • BOX_SERVER_WEB_WEBROOT=/app/public
  • BOX_SERVER_WEB_WEBROOT=public

Web 容器启动时的输出:

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

这对我来说都是全新的,所以我可能做错了一些事情,我想知道这是否是文件夹嵌套的问题,尽管我已经尝试重新排列它但无法提出可行的解决方案。

最佳答案

您正在使用预热图像

image: ortussolutions/commandbox:lucee5

这意味着服务器已经启动并“锁定”到它的所有设置,包括网络根目录。使用从未启动过服务器的 Vanilla 命令框图像,这样当您预热图像时,您将第一次使用您的设置启动它。

要设置自定义 Web 根目录,您需要将其添加到您的 docker 文件中

ENV APP_DIR=/app/public

关于带有 Commandbox 的 Docker-Compose 无法更改 Web 根目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71247957/

相关文章:

logging - 如何查看 docker-compose 健康检查日志?

Docker compose/swarm 3 : docker file path , 构建、容器名称、链接、迁移

tomcat - URLRewriteFilter 和 FW1

docker - 如何在声明性 Jenkins 管道中使用 Docker 的 --cache-from 构建标志?

docker - 为什么 docker 必须从 dockerfile 创建镜像,然后从镜像创建容器,而不是从 Dockerfile 创建容器?

docker - 在 Docker 容器中运行 etcd

java - dateTimeFormat 的有效掩码模式

Docker 错误 : No access to/dev/mem. 尝试以 root 身份运行

docker - 在使用docker-compose启动webapp之前如何填充Elasticsearch数据库?

mySql Query 在查询浏览器中工作,但在 CFquery 中运行时失败