0

I have a docker-compose.yml which looks like this:

version: '3'

services:
  tomcat:
    container_name: tomcat8
    restart: always
    image: tomcat:8-jdk8
    ports:
    - 80:8080
    volumes:
    - /var/docker/myservice/tomcat/data/webapps:/usr/local/tomcat/webapps:Z

I want to mount the tomcat/webapps folder inside the container to the host so that I don't have to enter the docker container to modify the applications.

However, when this container starts up, the /usr/local/tomcat/webapps folder becomes empty. The ROOT/, docs/, examples/, host-manager/, manager/ folders that should have been created when tomcat starts up are all gone.

I originally thought this is because that the container does not have permission to write to the volume on the host machine. But I've followed this post's instruction to add an Z at the end of the volume.

What's wrong with my configuration? Why does /usr/local/tomcat/webapps folder inside the container become empty?

Is there any way to let the data in /usr/local/tomcat/webapps in the container to overwrite the data in /var/docker/myservice/tomcat/data/webapps in the host machine?

Brian
  • 12,145
  • 20
  • 90
  • 153

1 Answers1

0

For tomcat:8-jdk8, we could see next:

$ docker inspect tomcat:8-jdk8 | grep Entrypoint
        "Entrypoint": null,
        "Entrypoint": null,

Also, see tomcat:8-jdk8 Dockerfile:

CMD ["catalina.sh", "run"]

To sum all, the only start script for a container is catalina.sh, so if we override it like next:

$ docker run -it --rm tomcat:8-jdk8 ls /usr/local/tomcat/webapps
ROOT  docs  examples  host-manager  manager

We can see even we did not start any start script like catalina.sh, we still can see ROOT, docks, etc in /usr/local/tomcat/webapps.

This means, above folders just in the image tomcat:8-jdk8 not dynamically generated by catalina.sh. So, when you use - /var/docker/myservice/tomcat/data/webapps:/usr/local/tomcat/webapps as a bind mount volume, the empty folder on host will just override all things in the container folder /usr/local/tomcat/webapps, so you will see empty folder in container.

UPDATE:

Is there any way to let the data in /usr/local/tomcat/webapps in the container to overwrite the data in /var/docker/myservice/tomcat/data/webapps in the host machine?

The nearest solution is to use named volume:

docker-compose.yaml:

version: '3'

services:
  tomcat:
    container_name: tomcat8
    restart: always
    image: tomcat:8-jdk8
    ports:
    - 80:8080
    volumes:
    - my-data:/usr/local/tomcat/webapps:Z

volumes:
  my-data:

Then see next command list: (NOTE: 99_my-data, here 99 is the folder where you store your docker-compose.yaml)

shubuntu1@shubuntu1:~/99$ docker-compose up -d
Creating tomcat8 ... done
shubuntu1@shubuntu1:~/99$ docker volume inspect 99_my-data
[
    {
        "CreatedAt": "2019-07-15T15:09:32+08:00",
        "Driver": "local",
        "Labels": {
            "com.docker.compose.project": "99",
            "com.docker.compose.version": "1.24.0",
            "com.docker.compose.volume": "my-data"
        },
        "Mountpoint": "/var/lib/docker/volumes/99_my-data/_data",
        "Name": "99_my-data",
        "Options": null,
        "Scope": "local"
    }
]
shubuntu1@shubuntu1:~/99$ sudo -s -H
root@shubuntu1:/home/shubuntu1/99# cd /var/lib/docker/volumes/99_my-data/_data
root@shubuntu1:/var/lib/docker/volumes/99_my-data/_data# ls -alh
total 28K
drwxr-xr-x  7 root root 4.0K 7月  15 15:09 .
drwxr-xr-x  3 root root 4.0K 7月  15 15:09 ..
drwxr-xr-x 14 root root 4.0K 7月  15 15:09 docs
drwxr-xr-x  6 root root 4.0K 7月  15 15:09 examples
drwxr-xr-x  5 root root 4.0K 7月  15 15:09 host-manager
drwxr-xr-x  5 root root 4.0K 7月  15 15:09 manager
drwxr-xr-x  3 root root 4.0K 7月  15 15:09 ROOT

This is the nearest way can pop contents to host.

Another solution: mount /var/docker/myservice/tomcat/data/webapps to the container folder but not /usr/local/tomcat/webapps, e.g. /tmp/abc, then customize your CMD to copy the things in /usr/local/tomcat/webapps to /tmp/abc, then in your host's /var/docker/myservice/tomcat/data/webapps could also see them...

atline
  • 28,355
  • 16
  • 77
  • 113
  • Is there any way to let the data in `/usr/local/tomcat/webapps` in the container to overwrite the data in `/var/docker/myservice/tomcat/data/webapps` in the host machine? – Brian Jul 15 '19 at 07:06
  • You can use named volume to pop up the contents to host, but not in the folder you specify, this is most near solution. You just need to pop to host, this is all you want? – atline Jul 15 '19 at 07:12