2015-12-01 47 views
2

我是Docker的新手,我有一个问题,我似乎无法找到答案。 我正在做一个Docker镜像(consol/tomcat-7.0),并且写了一个Dockerfile加载这个镜像,复制我的war文件,并将一个server.xml和独特的数据库连接细节以及默认主机复制到一个新镜像中。 如果我正在运行许多带有此映像的容器,那么让每个容器使用相同的war文件但连接到不同的数据库并在server.xml中具有不同的URL的正确方法是什么? 我目前正在用Dockerfile构建图像,每次我想要一个新的实例时都会有不同的细节,这看起来很浪费。将Tomcat参数传递给Docker

所以每次我想要一个新的实例,我运行“构建”使用这个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 

然后运行这个新形象。

这样做的正确方法是什么?

回答

0

至少有两种选择,我能想到的:

  • 如果server.xml中支持的环境变量,你可以通过--env甚至--env-file通过数据库连接信息的容器。请注意,这具有一定的安全性影响。
  • 另一种选择是通过--volume将特定实例的server.xml装入容器。
+0

12因子应用程序模式建议使用环境变量:请参阅http://12factor.net/config –

3

码头容器的典型方法是通过环境变量传递。

扩展在a solution to pass the port via command lineserver.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}值。

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

当运行泊坞窗图像使用-e标志在运行时设置此环境变量

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

可选还添加了--add-host如果你需要映射mysqlhost到一个特定的IP地址。

+0

感谢您的支持。即使我已经链接了它,但我的“mysqlhost”链接容器不会在我的META-INF/context.xml文件中作为IP进行解析。任何想法为什么? –