Today we are very excited to bring you the release of our latest Docker container for ContentBox v4.1.0. This is a major re-work of our container images as we now support over 6 different variations of our images, from warmed up servers to alpine versions of ContentBox. We have also added tons of new optimizations and environment variables to control container deployments. Ultimately, we have also updated our images to leverage the latest CommandBox 4.2.0 image!
Learn more about ContentBox at https://www.ortussolutions.com/products/contentbox and more about Docker deployment here: https://contentbox.ortusbooks.com/getting-started/installation/docker
Changelog
Here is a listing of the entire changelog for the image changes:
v3.1.2
- Don't warm up servers to reduce image size
- Add Adobe 11, 2018 images that where not running
- Tag versions of each of the warmed up engines, instead of just latest
v3.1.1
- Remove some cleanup scripts to avoid issues
v3.1.0
- Added new environment variables to control heap size:
JVM_HEAPSIZE
which defaults to512mb
- Updated CommandBox main image to 4.2.0
- Upgrade to ContentBox v4.1.0
- Removed legacy media root directory and leverage new custom module location:
/app/modules_app/contentbox-custom
- Added Adobe 2018 Tag
- Updated distributed example with Redis
v3.0.0
- Optimize for size
- Remove static healthcheck and just rely on the CommandBox image healthcheck, which makes more sense
- Removed some debugging files
- Updated CommandBox to 4.0.0
ORM_DIALECT
was not being used in the right place.EXPRESS
andHEADLESS
was not evaluated to a boolean, just existence- Removed usage of lowercase
install
,be
, andexpress
, you must use uppercase env variables. - Added
lucee5
to snapshot releases - Renamed
HEADLESS
flag so we don't clash with the CommandBox image. New Setting isREMOVE_CBADMIN
- Added Alpine version for ContentBox
Tags
We have our tags divided by either production or bleeding edge container images. Please choose wisely 💪
Production Tags
The following tags are based off our master
branch and are production-ready images. The version number matches the release of ContentBox
:latest
,:4.1.0
- Latest stable version of ContentBox =4.1.0
:alpine-{version}
- Latest stable version based off Alpine Linux:lucee5-{version}
- Latest stable version of this image with Lucee 5 warmed up:lucee45-{version}
- Latest stable version of this image with Lucee 4.5 warmed up:adobe2018-{version}
- Latest stable version of this image with Adobe 2018 warmed up:adobe2016-{version}
- Latest stable version of this image with Adobe 2016 warmed up:adobe11-{version}
- Latest stable version of this image with Adobe 11 warmed up
Development Tags
The following tags are based off our development
branch. These are bleeding edge container images that we use for testing until they are promoted to production tags.
:snapshot
- Development version of this image (Not of ContentBox, for ContentBox BE use the environment variableBE
.):alpine-snapshot
- Development version of this image based on Alpine Linux:lucee5-snapshot
- Development version of this image with Lucee 5 warmed up:lucee45-snapshot
- Development version of this image with Lucee 4.5 warmed up:adobe2018-snapshot
- Development version of this image with Adobe 2018 warmed up:adobe2016-snapshot
- Development version of this image with Adobe 2016 warmed up:adobe11-snapshot
- Development version of this image with Adobe 11 warmed up
Tip: Look in the tags section for other specific ContentBox versions
CommandBox Image Features
The ContentBox image is based on the CommandBox Image, so all features and environment variables are applicable. Please refer to that documentation as well: https://hub.docker.com/r/ortussolutions/commandbox/
Usage
This section assumes you are using the Official Docker Image
To deploy a new application, first pull the image (defaults to the latest
tag):
docker pull ortussolutions/contentbox
The image is packaged with a self-contained EXPRESS version, which uses a very fast and portable in-memory H2 database engine. To get started just run:
docker run -p 8080:8080 \
-e EXPRESS=true \
-e INSTALL=true \
ortussolutions/contentbox
Tip: The
INSTALL
flag tells the image to take you through the ContentBox installer to pre-seed a database. You can remove this flag once your database is seeded.
A new container will be spun up from the image and, upon opening your browser to http://[docker machine ip]:8080
, you will be directed to configure your ContentBox installation wizard.
Persisting Data Between Restarts
The above run
command produces an image which is self-contained, and would be destroyed when the container is stopped. If we wanted to run a version in production, we would need to persist, at the very minimum, the database and your custom assets (widgets, modules, themes and media library). In order to do this we need to mount those resources in to the Docker host file system.
By convention, the express
H2 database is stored at /data/contentbox/db
inside the container. In addition, the custom content module which contains your custom themes, widgets, modules and media library are stored under /app/modules_app/contentbox-custom
.
Mountable Points
Mount Point | Description |
---|---|
/data/contentbox/db | The express H2 database |
/app/modules_app/contentbox-custom | The custom code module |
/app/includes/shared/media | **The legacy media location, use the custom modules location instead. |
Let's mount both of those volume points, so that our database and user assets persists between restarts:
docker run -p 8080:8080 \
-e EXPRESS=true \
-e INSTALL=true \
-v `pwd`/contentbox-db:/data/contentbox/db \
-v `pwd`/contentbox-custom:/app/modules_app/contentbox-custom \
ortussolutions/contentbox
Now, once our image is up, we can walk through the initial configuration. Once configuration is complete, simply stop the container and then start it without the environment variable INSTALL
in place. The H2 database and uploads will be persisted and the installer will be removed automatically on container start.
docker run -p 8080:8080 \
-e EXPRESS=true \
-v `pwd`/contentbox-db:/data/contentbox/db \
-v `pwd`/contentbox-custom:/app/modules_app/contentbox-custom \
ortussolutions/contentbox
INSTALL
Setting Caveats
Please remember that the INSTALL environment variable is ONLY used to go through the ContentBox installer wizard. Once the database is seeded with the installation process, you will no longer use it unless you want to reconfigure the installation.
Custom Database Configuration
If you would like to connect your container to an external database system, you can very easily do so, which would allow us to connect from multiple containers in a distributed fashion (MySQL, Oracle, MSSQL, etc). If not, you run the risk of file locks if multiple container replicas are sharing the same H2 database.
Tip: We would suggest you use the H2 database or EXPRESS edition when using only 1 replica.
The image is configured to allow all ORM-supported JDBC drivers to be configured by specifying the environment variables to connect. Alternately, you may specify a CFCONFIG
environment variable which points to file containing your engine configuration, including datasources.
By convention, the datasource name expected is simply named
contentbox
.
To programatically configure the database on container start, environment variables which represent your datasource configuration should be provided. There are two patterns supported:
DB_DRIVER
configuration - which may be used for Adobe Coldfusion serversDB_CLASS
configuration - which configures a datasource by JDBC driver and connection string (Both Adobe and Lucee)
An example container run
command, configuring a MySQL database would be executed like so:
docker run -p 8080:8080 \
-e 'INSTALL=true' \
-e 'CFCONFIG_ADMINPASSWORD=myS3cur3P455' \
-e "DB_CONNECTION_STRING=jdbc:mysql: //mysqlhost:3306/contentbox_docker?useUnicode=true&characterEncoding=UTF-8&useLegacyDatetimeCode=true" \
-e 'DB_CLASS=org.gjt.mm.mysql.Driver' \
-e 'DB_USER=contentbox_user' \
-e 'DB_PASSWORD=myS3cur3P455' \
-v `pwd`/contentbox-custom:/app/modules_app/contentbox-custom \
ortussolutions/contentbox
To use the DB_DRIVER
syntax for Adobe Coldfusion, an example run
command would be:
docker run -p 8080:8080 \
-e 'CFENGINE=adobe@11' \
-e 'INSTALL=true' \
-e 'CFCONFIG_ADMINPASSWORD=myS3cur3P455' \
-e 'DB_DRIVER=MSSQLServer' \
-e 'DB_HOST=sqlserver_host' \
-e 'DB_PORT=1433' \
-e 'DB_NAME=contentbox_docker' \
-e 'DB_USER=sa' \
-e 'DB_PASSWORD=myS3cur3P455' \
-v `pwd`/contentbox-custom:/app/modules_app/contentbox-custom \
ortussolutions/contentbox
As you can see, these commands can become quite long. As such, using Docker Compose or CFConfig may provide a more manageable alternative.
Granular Environmental Control
A number of environment variables, specific to the ContentBox image, are availabe for use. They include:
EXPRESS=true
- Uses an H2, in-memory database. Useful for very small sites or for testing the image. See http://www.h2database.com/html/main.htmlINSTALL=true
(alias:INSTALLER
) - Adds the installer module at runtime, to assist in configuring your installation. You would omit this from yourrun
command, once your database has been configuredBE=true
- Uses the bleeding edge snapshot of the ContentBox CMS, else we will defer to the latest stable version of ContentBox.HEALTHCHECK_URI
- Specifies the URI endpoint for container health checks. By default, this is sethttp://127.0.0.1:${Setting: PORT not found}/
at 1 minute intervals with 5 retries and a timeout of 30sFWREINIT_PW
- Allows you to specify the reinit password for the ColdBox frameworkSESSION_STORAGE
- Allows the customization of session storage. Allows any validthis.sessionStorage
value, available in Application.cfc. By default it will use the JDBC connection to store your sessions in your database of choice.DISTRIBUTED_CACHE
- Allows you to specify a CacheBox cache region for distributing ContentBox content, flash messages, cache storage, RSS feeds, sitemaps and settings. There are only three cache regions defined in this image:default
,template
andjdbc
.jdbc
is the default cache that will distribute your data,default
andtemplate
are in-memory caches. Please see the distributed caching section below to see how to register more caches.H2_DIR
- Allows you to specify a custom directory path for your H2 database. By convention, this is set to/data/contentbox/db
within the containercontentbox_default_*
- All Contentbox "Geek Settings" may be provided as environment variables, allowing granular control of your ContentBox settings.ORM_SECONDARY_CACHE
- Iftrue
it will activate the ORM secondary cash to theehcache
provider. By default it is turned off.ORM_DIALECT
- You can choose the specific ORM dialect if needed, if not we will try to auto-detect it for you.REMOVE_CBADMIN=false
- Iftrue
then this image will not publish an Admin module, just the core, REST and UI modules.JVM_HEAPSIZE=512
- The amount in megabytes to assign the JVM running ContentBox. We default it to 512mb.
In addition, the CommandBox docker image environment variables are also available to use in your container. For additional information on using the CommandBox docker image, see the initial release blog entry.
Automatic Session Distribution
By default, the ContentBox image will use the Lucee Open Source CFML engine for running the application. It will also configure the datasource to store user sessions so you can easily scale the image or send it to Docker Swarm, Kubernetes, etc for scalability.
You can also use the SESSION_STORAGE
environment variable to switch the connection to any backend you like.
Distributed Caching
By default, our image configures a jdbc
CacheBox cache region that will be used to distribute settings, sessions, flash data, content, RSS feeds, sitemaps, etc. This means that out-of-the-box, your ContentBox containers can use the database to distribute its content within a swarm or set of services. However, if you would like to use your own CacheBox providers or a more sophisticated distributed cache like Redis or Couchbase, you can.
We have also prepared a docker compose and distribution example using Redis (more caches to come) and the ContentBox image. This example will allow you to have a stack that can easily distribute your sessions and content via Redis. You can find the repository in this repo under the folder: distributed-example
Healthchecks
The image contains built-in capabilities for healthchecks for the running application. You can customize the URL entry point by using the HEALTHCHECK_URI
environment variable. By default, this is set http://127.0.0.1:${Setting: PORT not found}/
at 1 minute intervals with 5 retries and a timeout of 30s.
Add Your Comment