Hop Web in Docker: persistence and upgrades
The official Hop Web image is apache/hop-web. It is a long-lived GUI: people design pipelines and workflows in the browser, so project files, Hop configuration, and security files are operator data. They must live on the host or on a volume, not only inside the container filesystem.
This page answers how to run that image in an upgrade-friendly way:
-
which folders to preserve when you pull a new tag
-
which content should always come from the new image
-
how to add JDBC drivers (and why you should not persist
plugins/) -
which volume mounts to use, with a small Compose example
The Hop Web user manual covers starting the image, authentication modes, and the Security UI. The Docker container page covers the sibling apache/hop image (hop-run and Hop Server).
Two images, two persistence models
| Image | Role | Where the project lives |
|---|---|---|
| Hop Gui in a browser (authoring) | Outside the image: a host folder or a volume. The baked-in |
| hop-run (short-lived) or Hop Server (long-lived) | Often in a derived image for production execution. That is Project in a Docker image, not a Hop Web upgrade procedure. |
Do not docker commit a Hop Web container that has work saved in it, and do not treat the image’s own config/projects/ tree as your project home.
What always comes from the new image
Replace the container (new tag) to pick these up. Do not bind-mount over them:
| Content | Typical path in apache/hop-web |
|---|---|
Tomcat 10 and the JRE | image base |
Hop Web application (RAP UI, servlets) |
|
Plugin tree |
|
Bundled JDBC drivers |
|
Starter |
|
Pin an image tag (apache/hop-web:2.20.0, or the release you actually run). Do not use latest in production.
What to persist
The Hop Web image passes HOP_CONFIG_FOLDER and HOP_AUDIT_FOLDER into the JVM as system properties (CATALINA_OPTS in docker/web.Dockerfile). Override those variables and mount volumes at the paths you choose.
Recommended container paths below are conventions for this page and the Compose example; any path is fine as long as env vars and mounts match.
| Persist | Image default | Recommended container path | Holds |
|---|---|---|---|
|
|
|
|
Project homes |
|
|
|
Environment JSON | none |
| Hostnames, paths, resolvers. Keep secrets out of git. |
|
|
| Per-user UI state under |
Extra JDBC (optional) | bundled drivers only |
| Restricted drivers (Oracle, MySQL, MariaDB, DB2, …). See JDBC drivers and plugins. |
hop-config.json stores project names and home paths. It does not store the pipelines. If projectHome still points at ${HOP_CONFIG_FOLDER}/projects/samples, you are editing starter samples inside config. Register real projects with homes under /hop/projects/….
The entrypoint (docker/resources/run-web.sh) can register one project on every start from HOP_PROJECT_NAME and HOP_PROJECT_FOLDER. That is enough for a single-project demo. It does not keep GUI settings, extra projects, users, or project-access rules. A shared Hop Web instance should persist the whole HOP_CONFIG_FOLDER.
Configure with environment variables
Point Hop at the persisted layout. Do not copy files into the image and commit a new layer for day-to-day work.
| Variable | Role |
|---|---|
| Directory that contains |
| Per-user audit / UI state. Set to the audit volume, for example |
| Optional. The entrypoint registers this project in |
| Project config file name (default |
| Optional one-level parent project. See Hop Web. |
| Optional lifecycle environment registered on start. Paths are inside the container. |
| Comma-separated JDBC directories. Keep |
| Download restricted drivers on start. See Downloading JDBC drivers. |
| Authentication bootstrap. See Hop Web authentication. |
The process user is hop (UID and GID 501 in docker/web.Dockerfile). Bind-mounted host directories must be writable by that user. Named volumes created by Docker usually already are.
-
Bind-mount over
/usr/local/tomcat/plugins. -
Mount an empty directory onto the default config path (
/usr/local/tomcat/webapps/ROOT/config) unless you intend to hide the imagehop-config.jsonand the starter projects. Prefer a separate path (/hop/config) so the image tree stays available for reference. -
Use the
/configmount (Tomcattomcat-users.xml/web.xmloverlay) for environment JSON or project files. That path is only for EXTERNAL container authentication.
JDBC drivers and plugins
Plugins
The official apache/hop-web and apache/hop images already include the standard Hop plugin set. A new image tag is how you pick up plugin fixes and additions.
Do not persist plugins/ on a volume: an old tree mixed with a new image is a common upgrade failure.
Custom or marketplace extras that are not in the image can be:
-
installed in a small derived image (
FROM apache/hop-web, thenhop marketplace applyorCOPYthe plugin), or -
re-applied after you recreate the container (
hop marketplace apply -f …in the new container).
Plugin installs in Hop Web affect the shared server installation for every user; they are not per-session.
JDBC
Apache Hop does not redistribute drivers with a restricted license (Oracle, MySQL, MariaDB, IBM DB2, and others). Use one of:
-
Download on start — set
HOP_DRIVERS_DOWNLOAD(andHOP_DRIVERS_ACCEPT_LICENSE=truefor restricted drivers). Jars are written intoHOP_SHARED_JDBC_FOLDERS. They are ephemeral unless that folder is itself a volume. See Downloading JDBC drivers. -
Mount extra jars — put vendor jars on the host and mount them at
/hop/jdbc:HOP_SHARED_JDBC_FOLDERS=/usr/local/tomcat/jdbc-drivers,/hop/jdbcKeep the image’s
/usr/local/tomcat/jdbc-driverson that list so bundled drivers still load.
Authentication, authorization, and project mapping
From Hop 2.20, Hop Web can authenticate users and map them to built-in roles (Admin, User, Operator, Read-only), and the Projects plugin can restrict which projects a user may open.
Full behaviour, login modes (NONE, EXTERNAL, BASIC, OAUTH2), and the Security UI are documented in Hop Web authentication. For upgrades, the important fact is where those files live.
All of the following sit under ${HOP_CONFIG_FOLDER}/security/:
| File | Purpose |
|---|---|
| Authentication mode, OAuth settings, container/IdP role → Hop role mappings, login welcome message |
| Hop-managed BASIC users (PBKDF2 hashes) |
| Project access rules (user, Hop role, or IdP/LDAP group → project names or all projects) |
Persist ${HOP_CONFIG_FOLDER} and you keep project registrations, users, and “who may open which project” across image upgrades.
Configure project mapping in the GUI: Configuration → Security → Projects (project access). Enable filtering, add rules (user / role / group), and either allow all projects for that subject or list names. Security administrators (security.manage) always see every project. When no rule matches, defaultAllowAll decides whether the user sees all projects or none.
Put Hop Web behind TLS in any shared deployment. Do not use the seeded demo users (HOP_WEB_SEED_DEMO_USERS) outside local development.
Recommended mounts and Compose example
| Host / volume | Container path | Why |
|---|---|---|
Named volume |
| Survives |
Bind mount |
| Git working tree on the host. Commit pipelines from the host, not from inside the image. |
Named volume |
| Last opened files and similar per-user UI state |
Bind mount |
| Extra JDBC jars. Skip this mount if you use |
The same layout works under Kubernetes: persist those four paths with PersistentVolumeClaims or ConfigMaps/Secrets for environment JSON. The Helm chart does not yet declare them for you.
services:
hop-web:
image: apache/hop-web:<tag>
ports:
- "8080:8080"
environment:
HOP_CONFIG_FOLDER: /hop/config
HOP_AUDIT_FOLDER: /hop/audit
HOP_PROJECT_NAME: my-project
HOP_PROJECT_FOLDER: /hop/projects/my-project
HOP_SHARED_JDBC_FOLDERS: /usr/local/tomcat/jdbc-drivers,/hop/jdbc
HOP_WEB_SECURITY_MODE: BASIC
HOP_WEB_ADMIN_USER: admin
HOP_WEB_ADMIN_PASSWORD: {openvar}HOP_WEB_ADMIN_PASSWORD{closevar}
volumes:
- hop-config:/hop/config
- hop-audit:/hop/audit
- ./projects:/hop/projects
- ./jdbc:/hop/jdbc
volumes:
hop-config:
hop-audit: Replace <tag> with a released Hop version. Create ./projects/my-project (with project-config.json) on the host before the first start, and ensure it is writable by UID 501. Set HOP_WEB_ADMIN_PASSWORD in the environment or a Compose .env file; do not commit it.
For OAuth or Tomcat EXTERNAL authentication, keep this volume layout and follow Hop Web authentication for the extra settings. If you use EXTERNAL, mount tomcat-users.xml and web.xml at /config/ and do not put project files there.
Upgrade procedure
-
Commit or back up
./projects(and keep the Compose file and secrets). -
Change the image tag in Compose to the new Hop version.
-
docker compose pull -
docker compose up -d— same volumes and environment variables. -
Open http://localhost:8080/ui, confirm the project switcher, and (if authentication is enabled) sign in and check project access.
Do not copy plugins/, webapps/ROOT, or /opt/hop out of the old container into the new one.
Hop configuration from a previous 2.x version is expected to load. If you added marketplace plugins that are not in the new image, re-apply the install spec after the container is up.
See also
-
Hop Web — start the image, roles, BASIC / OAuth / EXTERNAL
-
Docker container —
apache/hop(hop-run and Hop Server) -
Installation and configuration — desktop
HOP_CONFIG_FOLDER(same idea, no container) -
Project in a Docker image — baking a project into
apache/hopfor execution