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 № 1O 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
.