У меня такая проблема:
Я хочу определить переменную среды в моем файле docker-compose.yml следующим образом:
services:
nginx:
image: nginx:1.13
container_name: nginx
restart: always
ports:
- "80:80"
- "9090:9090"
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
- ./nginx/html:/usr/share/nginx/html
webapp:
build: WebApp
container_name: webapp
environment:
- WEBAPPDB=jdbc:mysql://192.168.101.129:3306/webapp?useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8
expose:
- "8080"
depends_on:
- nginx
version: '2'
приложение webapp развертывается с использованием tomcat. Я хотел бы использовать переменную WEBAPPDB в файле context.xml следующим образом:
<Resource
auth = "Container"
driverClassName = "com.mysql.jdbc.Driver"
type = "javax.sql.DataSource"
initialSize = "0"
maxActive = "10"
maxIdle = "5"
maxWait = "5000"
minIdle = "0"
timeBetweenEvictionRunsMillis = "34000"
minEvictableIdleTimeMillis = "55000"
testOnBorrow = "true"
testWhileIdle = "true"
testOnReturn = "false"
validationQuery = "SELECT 1 FROM dual"
validationInterval = "30000"
removeAbandoned = "true"
removeAbandonedTimeout = "10"
name = "jdbc/webapp"
username = "username"
password = "password"
url = "${WEBAPPDB}"
/>
Как я могу это сделать? спасибо за помощь.

По документации Справочник по настройке Tomcat
Tomcat configuration files are formatted as schemaless XML; elements and attributes are case-sensitive. Apache Ant-style variable substitution is supported; a system property with the name propname may be used in a configuration file using the syntax ${propname}. All system properties are available including those set using the -D syntax, those automatically made available by the JVM and those configured in the $CATALINA_BASE/conf/catalina.properties file.
Чтобы он работал, переменная WEBAPPDB в context.xml должна быть доступна как системное свойство. Вы можете установить свойства системы несколькими способами (см. Tomcat 7 - где мне установить "системные свойства"?
). В вашем случае вы можете установить переменную среды JAVA_OPTS в файле docker-compose:
environment:
- JAVA_OPTS=-DWEBAPPDB=jdbc:mysql://192.168.101.129:3306/webapp?useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8
Работая таким образом:
docker-compose.yml:
services:
webapp:
build: webapp
container_name: webapp
environment:
- JAVA_OPTS= -Ddb.url=192.168.101.129 -Ddb.port=3306 -Ddb.username=test -Ddb.password=test
Dockerfile:
FROM bp91/ubuntu16.04-tomcat7-java8
COPY webapps /tmp/webapps/
ADD tomcat/bin /opt/tomcat/bin/
RUN chmod 775 /opt/tomcat/bin/catalina.sh
RUN chown root:root /opt/tomcat/bin/catalina.sh
RUN cp -r /tmp/webapps/* /opt/tomcat/webapps/
ENV JAVA_OPTS ""
EXPOSE 8282
CMD sh /opt/tomcat/bin/catalina.sh $JAVA_OPTS && touch /opt/tomcat/logs/webapp.log && tail -f /opt/tomcat/logs/webapp.log
server.xml:
<GlobalNamingResources>
<Resource
auth = "Container"
driverClassName = "com.mysql.jdbc.Driver"
type = "javax.sql.DataSource"
global = "jdbc/webapp"
initialSize = "0"
maxActive = "10"
maxIdle = "5"
maxWait = "5000"
minIdle = "0"
timeBetweenEvictionRunsMillis = "34000"
minEvictableIdleTimeMillis = "55000"
testOnBorrow = "true"
testWhileIdle = "true"
testOnReturn = "false"
validationQuery = "SELECT 1 FROM dual"
validationInterval = "30000"
removeAbandoned = "true"
removeAbandonedTimeout = "10"
name = "jdbc/webapp"
username = "${db.username}"
password = "${db.password}"
url = "jdbc:mysql://${db.url}:${db.port}/webapp?useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8"
</GlobalNamingResources>
Идеально. Обратите внимание, что JAVA_OPTS также работает в официальном образе докера Tomcat (hub.docker.com/_/tomcat) точно так же. Так что не нужно создавать Dockerfile только для этого.
@ b0fusb Я пробовал этот способ, но он не работает. Это не проблема переменных окружения (если я войду в контейнер, echo $ JAVA_OPTS напечатает мне эти переменные). Но похоже, что файл context.xml не видит переменных среды