/ / Passando parâmetros do Tomcat para o Docker - banco de dados, tomcat, configuração, docker, dockerfile

Passando parâmetros do Tomcat para o Docker - banco de dados, tomcat, configuração, docker, dockerfile

Eu sou novo no Docker e tenho uma pergunta queNão consigo encontrar a resposta para. Estou pegando uma imagem Docker (consol / tomcat-7.0) e escrevi um Dockerfile que carrega essa imagem, copia meus arquivos war e copia um server.xml, com detalhes de conexão de banco de dados exclusivos e host padrão, em uma nova imagem. Se estou executando muitos contêineres com esta imagem, qual é a maneira correta de fazer com que cada um use os mesmos arquivos war, mas se conectem a bancos de dados diferentes e tenham URLs diferentes em server.xml? Atualmente, estou construindo a imagem usando o Dockerfile com detalhes diferentes cada vez que desejo uma nova instância e isso parece um desperdício.

Portanto, sempre que desejo uma nova instância, executo "build" usando este 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

E então execute esta nova imagem.

Qual é a maneira correta de fazer isso?

Respostas:

4 para resposta № 1

O método típico para contêineres docker é passar por variáveis ​​de ambiente.

Expandindo em uma solução para passar a porta via linha de comando a server.xml precisa ser modificado para incorporar propriedades de JAVA_OPTS

Por exemplo, em 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>

Então você pode passar o valor de ${jdbc.url} a partir de propriedades na linha de comando.

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

Ao executar a imagem do docker, você usa o -e sinalizar para definir esta variável de ambiente em tempo de execução

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

Opcionalmente, também adicione um --add-host se você precisa mapear mysqlhost para um endereço IP específico.


1 para resposta № 2

Posso pensar em pelo menos duas opções:

  • Se server.xml suportar variáveis ​​de ambiente, você pode passar detalhes de conexão de banco de dados para o contêiner via --env ou até mesmo --env-file. Observe que isso tem certas implicações de segurança.
  • Outra opção seria montar server.xml para uma instância particular no contêiner via --volume.