PlantUML Server を Docker で動かすときの URL ルート設定

経緯

plantuml/plantuml-server:jetty は、 http://localhost:8080/ で動きますが、歴史的な経緯で http://localhost:8080/plantuml/ で動かしたいと思いました。

docker run 時に -e JAVA_OPTIONS="-Djetty.contextpath=/plantuml" を付けてみたり、 /var/lib/jetty/start.d/usr/local/jetty/etc 等の設定をいじったりしてみても変わってくれず、悩んでいました。

色々試行錯誤して、わりと簡単な形で落ち着きました。

解決

plantuml/plantuml-server:jetty の元となっている jetty の Desc を見ると、こんな記述が。

Deployment

Webapps can be deployed under /var/lib/jetty/webapps in the usual ways (WAR file, exploded WAR directory, or context XML file). To deploy your application to the / context, use the name ROOT.war, the directory name ROOT, or the context file ROOT.xml (case insensitive).

plantuml-server のコンテナを覗いてみると、確かに ROOT.war が置かれているので、これを起動前リネームしてやる感じにしてみました。

docker-entrypoint.sh の前に処理をするスクリプトを作り、

### /srv/plantuml-server/docker-entrypoint-custom.sh (0755)

#!/bin/sh
mv /var/lib/jetty/webapps/ROOT.war /var/lib/jetty/webapps/plantuml.war
exec /docker-entrypoint.sh "$@"

こいつを entrypoint に指定して docker run します。

docker run --rm --name plantuml-server \
-p 127.0.0.1:8080:8080 \
-v /srv/plantuml-server/docker-entrypoint-custom.sh:/docker-entrypoint-custom.sh:ro \
--entrypoint /docker-entrypoint-custom.sh \
plantuml/plantuml-server:jetty \

無事、 http://localhost:8080/plantuml で動くようになりました。

さいごに

今回に限らず、このやり方は、"わざわざ手元でビルドしなおす程でもない調整" をする時に使えそうです。