我是Docker的新手,我有一个问题似乎无法找到答案。 我正在使用Docker镜像(consol / tomcat-7.0)并编写了一个加载此图像的Dockerfile,复制我的war文件并将具有唯一数据库连接详细信息和默认主机的server.xml复制到新映像中。 如果我正在运行许多带有此映像的容器,那么让每个容器使用相同的war文件但连接到不同的数据库并在server.xml中具有不同的URL的正确方法是什么? 我目前正在使用Dockerfile构建映像,每次我想要一个新实例时都会有不同的细节,这似乎是浪费。
所以每次我想要一个新实例时,我都会使用这个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
然后运行这个新图像。
这样做的正确方法是什么?
答案 0 :(得分:5)
docker容器的典型方法是通过环境变量传递。
展开a solution to pass the port via command line需要修改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}
的值。
JAVA_OPTS="-Djdbc.url=jdbc:mysql:mysqlhost:3306/"
运行docker镜像时,使用-e
标志在运行时设置此环境变量
$ docker run -it -e "JAVA_OPTS=-Djdbc.url=jdbc:mysql:mysqlhost:3306/" --rm myjavadockerimage /opt/tomcat/bin/deploy-and-run.sh
如果您需要将mysqlhost
映射到特定的IP地址,还可以选择添加--add-host
。
答案 1 :(得分:2)
我能想到至少有两个选择:
--env
甚至--env-file
将数据库连接详细信息传递给容器。请注意,这具有一定的安全隐患。--volume
将特定实例的server.xml挂载到容器中。