I am new to Docker and I have a question that I can't seem to find the answer to. I am taking a Docker image (consol/tomcat-7.0) and wrote a Dockerfile that loads this image, copies my war files and copies a server.xml, with unique database connection details and default host, into a new image. If I am running many containers with this image on, what is the proper way to have each one use the same war files but connect to different databases and have different URLs in server.xml? I am currently building the image using the Dockerfile with different details each time I want to a new instance and this seems a waste.
So each time I want a new instance, I run 'build' using this Dockerfile:
FROM consol/tomcat-7.0:latest
MAINTAINER xxx
LABEL version="1.0"
EXPOSE 80 443
RUN mkdir /vhost/
COPY FILES /vhost/ /vhost/ # my war files - same on every instance
COPY FILES/server.xml /opt/tomcat/conf/ # my config file - different on each instance
And then run this new image.
What is the proper way of doing this?
The typical method for docker containers is passing via environment variables.
Expanding on a solution to pass the port via command line the
server.xml
needs to be modified so it takes in properties fromJAVA_OPTS
For example in
server.xml
Then you can pass value of
${jdbc.url}
from properties on the command line.When running the docker image you use the
-e
flag to set this environment variable at run timeOptionally also add a
--add-host
if you need to mapmysqlhost
to a specific ip address.There are at least two options I can think of:
--env
or even--env-file
. Note that this has certain security implications.--volume
.