Correct way to deploy WAR files in docker image

This is how I do it:

FROM tomcat:8.0
MAINTAINER David Ford <[email protected]>
ENV DB_HOST mySqlServer
ENV DB_USER joeBlow
ENV DB_PASSWORD bla bla bla
EXPOSE 8080
RUN rm -fr /usr/local/tomcat/webapps/ROOT
COPY target/webapp /usr/local/tomcat/webapps/ROOT

On my todo list: separate out the WEB_INF/lib dir into its own container.


You should actually ALWAYS deploy the exploded .war.

There are two elements of speed to think about here:

  1. How fast is it to be able to push up your image to a container repository?

    and

  2. How quickly can a new instance of my container start serving requests? (important in an elastic-scaling environment)

The answer to both is the same: You are better off exploding the .war file when creating your container and NOT copying the .war file to it.

This has the following two very positive effects:

  1. It makes the differences between container versions much smaller, and so your upload time is less.
  2. It means that, when dynamically scaling to meet application demand, your new container instances don't have to unzip your .war file before they can start responding to requests.

For those of us burdened by slow-upload connections, it's also a great idea to use a CI server or even a cloud-hosted VM to build and push your docker images to dockerhub or another container registry. That way you can take advantage of gigabit-scale upload speeds.