将Tomcatparameter passing给Docker
我是Docker的新手,我有一个问题,我似乎无法find答案。 我正在做一个Docker镜像(consol / tomcat-7.0),并写了一个加载这个镜像的Dockerfile,复制我的war文件,并将一个server.xml,具有唯一的数据库连接细节和默认主机复制到一个新镜像中。 如果我运行了许多带有这个映像的容器,那么让每一个使用相同的war文件,但连接到不同的数据库,并在server.xml中有不同的URL的正确方法是什么? 我目前正在使用不同的细节Dockerfilebuild立图像,每次我想要一个新的实例,这似乎是一个浪费。
所以每次我想要一个新的实例时,我使用这个Dockerfile运行'build':
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
然后运行这个新的图像。
这样做的正确方法是什么?
docker集装箱的典型方法是通过环境variables传递。
扩展解决scheme以通过命令行传递端口 , server.xml
需要被修改,以便从JAVA_OPTS
例如在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>
然后,您可以${jdbc.url}
上的属性传递${jdbc.url}
值。
JAVA_OPTS="-Djdbc.url=jdbc:mysql:mysqlhost:3306/"
在运行docker映像时,使用-e
标志在运行时设置此环境variables
$ docker run -it -e "JAVA_OPTS=-Djdbc.url=jdbc:mysql:mysqlhost:3306/" --rm myjavadockerimage /opt/tomcat/bin/deploy-and-run.sh
如果需要将mysqlhost
映射到特定的IP地址,也可以select添加--add-host
。
至less有两个select我可以想到:
- 如果server.xml支持环境variables,则可以通过
--env
甚至是--env-file
将数据库连接详细信息传递给容器。 请注意,这具有一定的安全性影响。 - 另一种select是通过
--volume
将特定实例的server.xml安装到容器中。