Passing Tomcat parameters to Docker

2019-03-30 23:56发布

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?

2条回答
叛逆
2楼-- · 2019-03-31 00:15

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 from JAVA_OPTS

For example in server.xml

<GlobalNamingResources>
    <Resource Name="jdbc/Addresses"
        auth="Container"
        type="javax.sql.Datasource"
        username="auser"
        password="Secret"
        driverClassName="com.mysql.jdbc.Driver"
        description="Global Address Database"
        url="${jdbc.url}" />
</GlobalNamingResources>

Then you can pass value of ${jdbc.url} from properties on the command line.

JAVA_OPTS="-Djdbc.url=jdbc:mysql:mysqlhost:3306/"

When running the docker image you use the -e flag to set this environment variable at run time

$ docker run -it -e "JAVA_OPTS=-Djdbc.url=jdbc:mysql:mysqlhost:3306/" --rm myjavadockerimage /opt/tomcat/bin/deploy-and-run.sh

Optionally also add a --add-host if you need to map mysqlhost to a specific ip address.

查看更多
爱情/是我丢掉的垃圾
3楼-- · 2019-03-31 00:39

There are at least two options I can think of:

  • If server.xml supports environment variables, you could pass database connection details to the container via --env or even --env-file. Note that this has certain security implications.
  • Another option would be to mount server.xml for a particular instance into the container via --volume.
查看更多
登录 后发表回答