Semaphore Studio with Docker
- Last Updated: May 13, 2026
- 4 minute read
- Semaphore
- Documentation
To build a docker image and containers for Studio:
-
Create a folder for your Studio docker project. Store all the files in this folder.
-
Download all the necessary RPM files to install Studio. You will need:
-
Java 11 x64: A supported JDK. In this example, we will be using Amazon Corretto JDK 11 RPM for Linux x64.
-
Semaphore Studio RPM installation file
-
-
Create a file named
start-studio.shcontaining the following:#!/bin/bash function shutdown { cd /opt/semaphore/kmm export CATALINA_BASE=/opt/semaphore/kmm /opt/semaphore/tomcat/bin/shutdown.sh sleep 100 pkill java sleep 10 exit } echo echo "Starting Semaphore Studio" echo trap shutdown SIGHUP SIGINT SIGTERM # Unpack the tarball under /var/opt/semaphore if studio folder does not exist (for bind mounts). [ ! -d "/var/opt/semaphore/studio/" ] && tar xvzf /sem_var_opt_sem.tgz # Unpack the tarball under /etc/opt/semaphore if studio folder does not exist (for bind mounts). [ ! -d "/etc/opt/semaphore/studio/" ] && tar xvzf /sem_etc_opt_sem.tgz # Start services cd /opt/semaphore/da JAVA_HOME=/usr/lib/jvm/java-11-amazon-corretto/opt/semaphore/da/bin/start.sh & cd /opt/semaphore/rm JAVA_HOME=/usr/lib/jvm/java-11-amazon-corretto /opt/semaphore/rm/bin/start.sh & cd /opt/semaphore/sm JAVA_HOME=/usr/lib/jvm/java-11-amazon-corretto/opt/semaphore/sm/bin/start.sh & export CATALINA_HOME=/opt/semaphore/tomcat export JAVA_HOME=/usr/lib/jvm/java-11-amazon-corretto cd /opt/semaphore/kmm SEMAPHORE_WORKBENCH_HOME=/var/opt/semaphore/kmm/data JAVA_HOME=/usr/lib/jvm/java-11-amazon-corretto CATALINA_BASE=/opt/semaphore/kmm /opt/semaphore/tomcat/bin/startup.sh cd /opt/semaphore/studio JAVA_HOME=/usr/lib/jvm/java-11-amazon-corretto /opt/semaphore/studio/bin/start.sh & cd /opt/semaphore if [ ! -f ".env_configured" ]; then sleep 30 # configure SES, CS and publishing permission defaults on first startup. /opt/semaphore/upload-license.sh &> upload-license.log /opt/semaphore/create-ses-service.sh &> create-ses-service.log /opt/semaphore/create-cs-service.sh &> create-cs-service.log /opt/semaphore/add-superadmin-publish-permission.sh &> add-superadmin-publish-permission.log touch ".env_configured" fi while true do sleep 1 doneYou will use this script to launch containers. This script launches Studio, KMM, RM, SM and DA as background processes, and then sleeps periodically until the container stops. The
trapcommand maps various process signals to our customshutdownfunction which exits the script. The tar operations for/var/opt/semaphoreand/etc/opt/semaphoreare used to pre-populate filesystem, if using bind mounts rather than docker volumes. Note that this script starts three background processes: KMM as a Tomcat service, and the remaining as Quarkus service applications.The
SEMAPHORE_WORKBENCH_HOMEenvironment variable is very important as it puts the database for KMM on the/var/opt/semaphoreexternal volume. After building the container, you should confirm that the/var/opt/semaphore/kmm/datafolder has a workspace folder:docker exec -it studio563-1 bash cd /var/opt/semaphore/kmm/data/ ls -l -
Add a default user to
studio-authentication.propertiesfor Studio. This will allow you to log in after creating the container.# Authentication mechanisms: FORM, LDAP, OIDC, NO_AUTH studio.auth.mechanism=FORM ## User & Roles ### If the properties are stored in plain text. If this is true (the default) then it is expected that the passwords are of the form HEX( MD5 #quarkus.security.users.embedded.plain-text=true #quarkus.security.users.embedded.algorithm=digest-md5 ### The user to password mappings are specified by properties keys of the form quarkus.security.users.embedded.users.<user>=<password>. quarkus.security.users.embedded.users.SuperAdministrator=admin quarkus.security.users.embedded.users.Administrator=admin quarkus.security.users.embedded.users.user=User ### The user to role mappings are specified by properties keys of the form quarkus.security.users.embedded.roles.<user>=role1[,role2[,role3[, quarkus.security.users.embedded.roles.SuperAdministrator=SemaphoreSuperAdministrators,SemaphoreAdministrators,SemaphoreRoots quarkus.security.users.embedded.roles.Administrator=SemaphoreAdministrators quarkus.security.users.embedded.roles.User=SemaphoreUsers -
Once all the prerequisites are copied to your project folder, build the Dockerfile.
We start the Dockerfile using the Oracle Enterprise Linux version 8 image. We then install all the RPMs, configure some environment variables, copy files and scripts onto the local image, and define the exposed ports and
/var/opt/semaphoreas our external volume.The following is an example DockerFile:
FROM oraclelinux:8 LABEL maintainer="Progress Semaphore Semaphore Ltd" LABEL sem5-version="5.6.3" # Copy local RPMs and licence file to image RUN mkdir /local-rpms/ COPY *.rpm /local-rpms/ # Get CentOS updates and install rpms, and clean up. RUN yum -y --setopt=tsflags=nodocs update && \ yum install -y --setopt=tsflags=nodocs patch && \ yum install -y util-linux-user && \ yum install -y jq && \ yum install -y less && \ yum install -y --setopt=tsflags=nodocs /local-rpms/java-11-amazon-corretto-devel-11.*.*.rpm && \ yum install -y /local-rpms/Semaphore-Studio-5.6.3-1.noarch.rpm && \ yum install -y tar && \ yum clean all # Default authentication file with SuperAdministrator, Administrator and User accounts COPY studio-authentication.properties /opt/semaphore/studio/conf/studio-authentication.properties #Copy in the daemon creation script and start script COPY start-studio.sh /opt/semaphore #Copy the configure-studio.sh and licence file to image COPY create-ses-service.sh /opt/semaphore COPY create-cs-service.sh /opt/semaphore COPY add-superadmin-publish-permission.sh /opt/semaphore COPY upload-license.sh /opt/semaphore COPY licence /opt/semaphore # make scripts executable RUN chmod 777 /opt/semaphore/start-studio.sh RUN chmod 777 /opt/semaphore/create-ses-service.sh RUN chmod 777 /opt/semaphore/create-cs-service.sh RUN chmod 777 /opt/semaphore/upload-license.sh RUN chmod 777 /opt/semaphore/add-superadmin-publish-permission.sh # TAR the directories and files under /var/opt/semaphore and /etc/opt/semaphore # so we can initialize bind mounts if necessary. Still works with docker volumes. RUN cd / && tar cvzf sem_var_opt_sem.tgz /var/opt/semaphore/ && tar cvzf sem_etc_opt_sem.tgz /etc/opt/semaphore/ # set path environment variable ENV PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/semaphore # external volumes off union filesystem VOLUME ["/var/opt/semaphore"] VOLUME ["/etc/opt/semaphore"] # Export Studio port 5080 EXPOSE 5080 CMD ["/opt/semaphore/start-studio.sh"]The filesystem locations
/var/opt/semaphoreand/etc/opt/semaphoreare declared external volumes with theVOLUMEkeyword. They contain state that changes when the application runs. Use a named docker volume if possible when starting the container. If you must use bind mounts rather than docker volumes, we've provided a simple technique usingtar.gzfiles in the image to pre-populate the filesystem when the application starts. -
Create the scripts that build the Classification Server, Semantic Enhancement Service services in Studio, and assign publisher permissions for SuperAdministrator account.
See the docker-examples in github for example scripts that use cURL to configure studio after startup. These scripts include:
-
Uploading a license file (upload-license.sh)
-
Defining an SES service (create-ses-service.sh) Defining CLS Service (create-cs-service.sh)
-
Setting Publishing Permissions for the SuperAdministrator account (add-superadmin-publish-permissions.sh)
-
-
Build the image using the following command:
docker build -t studio563 -
Once the image is successfully built, run to build a container instance using the following command:
docker run -d --name studio563-1 -p 5080:5080 \ --mount src=sem5_studio_var_volume,target=/var/opt/semaphore,type=volume \ --mount src=sem5_studio_etc_volume,target=/etc/opt/semaphore,type=volume \ studio563Note the use of the
--mountflag. It is very important to use a named volume for the external volume indicated at/var/opt/semaphoreand/etc/opt/semaphore.If you use bind mounts, run as follows:
docker run -d --name studio563-1 -p 5080:5080 \ --mount src=/path/to/local/var/folder,target=/var/opt/semaphore,type=bind \ --mount src=/path/to/local/etc/folder,target=/etc/opt/semaphore,type=bind \ studio563 -
Use the docker ps command to verify that the container is running. I successful, you should see the following container running:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS c06a135be25b studio563 \"/opt/semaphore/star...\" 15 minutes ago Up 15 minutes 0.0.0.0:5080->5080/tcp
Open your browser and go to the http://localhost:5080 to confirm that Studio is up and running.