Docker Compose how to mount a volume pointing to a Tomcat application (i.e. MY-APP/WEB-INF/AppData)

Dear all,

I am hoping you can provide some guidance. I was reading the forum but I did no fully comprehend if there is a work around or if this is expected behavior.

Issue:
I am currently experimenting with docker and creating persistent volumes with tomcat.

I have a WAR file that writes a tiny piece of information to a file in WEB-INF/APP-DATA/. I am doing this only for docker. But I am assuming that once I configure a volume my data can persist across restarts and rebuilds of the docker container.

I built a docker compose file as follow:

version: '3.8'
services:
  tomcat:
    build:
      context: .
      dockerfile: ./Dockerfile

    container_name: MY-APP
    image: my-app:1.1.4
    restart: unless-stopped

    ports:
      - "8080:8080"

    volumes:
      - ./logs:/usr/local/tomcat/logs
      - ./AppData:/usr/local/tomcat/webapps/MY-APP/WEB-INF/AppData

Here is the Dockerfile as follows:

FROM tomcat:9.0.59-jdk11
LABEL maintainer="max max@max.com"
ADD ./target/MY-APP.war /usr/local/tomcat/webapps/
EXPOSE 8080
CMD ["catalina.sh", "run"]

Observations:
When I use ./AppData:/usr/local/tomcat/webapps/MY-APP/WEB-INF/AppData and do docker-compose up The WAR file does not get exploded. I suspect tomcat does not do anything because it sees that MY-APP… already exist. Now if I map it as ./AppData:/usr/local/AppData then tomcat explodes the WAR file correctly.

Questions:

  • So is my thinking incorrect about being able to write data into the MY-APP/WEB-INF/AppData then map a volume from the host?

  • Is there a special trick when I can tell docker to wait to map the volume once the WAR file has been explored or what is the general practice.

Thanks in advance for any guidance,

max