ADR 0001: Local Docker development for WebVOWL + OWL2VOWL

June 4, 2026 · View on GitHub

MetadataValue
StatusAccepted (implemented in this repository)
Date2026-06-04
DecidersVisualDataWeb maintainers / local dev workflow
Supersedeswget-based root Dockerfile on upstream master

Context

WebVOWL needs a browser UI and an OWL2VOWL backend on the same origin (/convert, /serverTimeStamp). Upstream Docker docs build an image that downloads webvowl_1.1.7.war from vowl.visualdataweb.org. That host is compromised or unreachable (HTTP 520/403, corrupt HTML served as WAR). See #212, #203, #180.

Constraints:

  • Small images where possible (multi-stage, no nginx/supervisor unless required).
  • Volume mounts for ontologies (/data) and optional frontend overlay (deploy/).
  • Do not change application build toolchains (Java 8, Maven as-is, Node 12 / Webpack 1 / Grunt).
  • Bump only container base image tags (Tomcat 9.0.118, Maven 3.9.16, Temurin 8 on Noble, Node 12 Alpine — see docker/Dockerfile ARGs).
  • All deliverables live inside Git repositories (WebVOWL + OWL2VOWL), not in a parent folder outside clones.

Local checkout: WebVOWL repository only. OWL2VOWL is not cloned on the host.

Decision

  1. Default: docker-compose.yml + docker/Dockerfile (full stack).
  2. OWL2VOWL at image build time: git clone in the Maven stage (OWL2VOWL_GIT_URL / OWL2VOWL_GIT_REF, default master). No Compose additional_contexts and no sibling directory.
  3. Multi-stage build:
    • Maven 3.9-eclipse-temurin-8owl2vowl.war
    • Node 12-alpinenpm install --ignore-scripts + npm run release
    • Tomcat 9.0.118-jdk8-temurin-noble → explode WAR into ROOT, overlay deploy/
  4. Single Tomcat ROOT (same design as PR #215).
  5. Reject PR #214 nginx/Java 17 split compose for this workflow.
  6. Frontend-only variant: docker/Dockerfile.frontend + docker-compose.frontend.yml.
  7. OWL2VOWL documents sibling checkout in OWL2VOWL/doc/docker/README.md; .dockerignore excludes large ontologies/ when used as build context.
  8. Hardening: non-root tomcat / owl2vowl users, image + compose HEALTHCHECK, no-new-privileges, JRE runtime after WAR explode in JDK stage.
  9. CI/CD: .github/workflows/docker-ci.yml (PR/build test), docker-release.yml (push tagged images to ghcr.io).

Rationale

ApproachWhy chosen / rejected
wget WARBroken (#212).
Sibling ../OWL2VOWL checkoutReplaced by git clone inside docker/Dockerfile (network at build time).
PR #215Correct merge model; arm64 fix: --ignore-scripts.
PR #214Java 17 + nginx rejected.
Two services, two ports, no proxyBreaks relative /convert (#195).
doc/Docker legacy/data volume pattern kept; inotify batch job not ported.

Consequences

Positive

  • No external WAR download; converter on same origin.
  • ~358 MB runtime image (2026-06-04, arm64).
  • Mount ./data; optional ./deploy overlay.

Negative / follow-ups

  • Merged build needs network to clone OWL2VOWL; pin OWL2VOWL_GIT_REF for reproducible releases.
  • Node 12 / Java 8 EOL.
  • #111 Docker Hub not addressed.
  • Align upstream PR #215 with this layout.

Verification (2026-06-04)

Environment: Docker 29.4, macOS arm64.

cd WebVOWL
docker compose build && docker compose up -d
curl -sf http://localhost:8080/serverTimeStamp
# POST foaf.rdf to /convert (any local OWL file)

Implementation map (WebVOWL)

PathRole
docker-compose.ymlFull stack (OWL2VOWL cloned in build)
docker-compose.frontend.ymlUI only
docker/DockerfileMerged image
docker/Dockerfile.frontendFrontend-only image
docker/README.mdOperator guide (security, GHCR)
.github/workflows/docker-ci.ymlPR / main build + smoke test
.github/workflows/docker-release.ymlPublish to GHCR on tag v*
.dockerignoreWebVOWL build context
data/Host mount → /data
docs/adr/0001-…This ADR

Implementation map (OWL2VOWL)

PathRole
doc/docker/README.mdSibling checkout + standalone JAR image
.dockerignoreExclude ontologies/ from Docker context
DockerfileStandalone converter (non-root, healthcheck)
.github/workflows/docker-ci.ymlPR / main build + smoke test
.github/workflows/docker-release.ymlGHCR on tag v*
#StateTitleRelevance
212OPENDocker compose: wget HTTP 520Primary
203OPENREADME Docker instructions do not workFixed here
202OPENTemporary fix as website is downSame root cause
195OPENCould not establish OWL2VOWL connectionFixed with merged image
201OPENOWL2VOWL service errorRelated
180CLOSEDUnable to download war releaseHistorical
206CLOSEDService is downDomain context
183OPENWebVOWL cannot be rebuildAddressed via source build
111OPENDocker Hub imageNot implemented
100CLOSEDAdd DockerfileOriginal Docker support
#StateTitleNotes
215OPENBuild from source in DockerAlign with this ADR
214CLOSEDModernize Docker (Java 17, nginx)Rejected scope
213CLOSEDDuplicate of #214
114OPENchore(docker): update imagewget-based; obsolete
207DRAFTDockerfile page amd64Partial
181MERGEDFixed Docker File
170MERGEDDockerized WebVOWL
102MERGEDFix #100 Add Docker
#StateTitleNotes
47MERGEDDockerizeStandalone OWL2VOWL/Dockerfile; merged build uses Maven stage in WebVOWL

References