将Tomcat参数传递给Docker

use*_*861 4 database configuration tomcat docker dockerfile

我是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
Run Code Online (Sandbox Code Playgroud)

然后运行这个新图像.

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

小智 5

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>
Run Code Online (Sandbox Code Playgroud)

然后,您可以${jdbc.url}在命令行上传递属性的值.

JAVA_OPTS="-Djdbc.url=jdbc:mysql:mysqlhost:3306/"
Run Code Online (Sandbox Code Playgroud)

运行docker镜像时,使用该-e标志在运行时设置此环境变量

$ docker run -it -e "JAVA_OPTS=-Djdbc.url=jdbc:mysql:mysqlhost:3306/" --rm myjavadockerimage /opt/tomcat/bin/deploy-and-run.sh
Run Code Online (Sandbox Code Playgroud)

--add-host如果需要映射mysqlhost到特定的IP地址,还可以选择添加一个.


Evg*_*kiy 2

我至少能想到两个选择:

  • --env如果 server.xml 支持环境变量,您可以通过或 甚至将数据库连接详细信息传递到容器--env-file。请注意,这具有一定的安全隐患。
  • 另一种选择是通过将特定实例的 server.xml 安装到容器中--volume