将Tomcat参数传递给Docker

5
我是一名新手,刚开始学习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

然后运行这个新镜像。

正确的做法是什么?

2个回答

6

docker容器的典型方法是通过环境变量传递参数。

扩展通过命令行传递端口号的解决方案,需要修改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
谢谢您的回复。虽然我已经链接了它,但是我的“mysqlhost”链接容器在我的META-INF/context.xml文件中无法解析为IP地址。您有什么想法吗? - Alex White

2

我至少可以想到两个选项:

  • 如果server.xml支持环境变量,您可以通过--env或者--env-file将数据库连接详细信息传递给容器。请注意,这具有一定的安全性影响。
  • 另一个选项是通过--volume将特定实例的server.xml挂载到容器中。

12因素应用程序模式建议使用环境变量:请参阅http://12factor.net/config - Mark O'Connor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接