2015-12-01 52 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進行解析。任何想法爲什麼? –