有没有办法从Docker容器内部找出该容器是在Linux主机上还是在Docker Machine中本机运行的?
问题的背景是我想在基于Tomcat的容器中启用JMX,但为此,我需要知道主机的外部IP地址:
我有一个Docker Tomcat图像,我希望在启用JMX的情况下推出,但我不知道人们是在本地使用它还是在Docker-Machine中运行,因此我不知道启动Tomcat时为java.rmi.server.hostname
参数提供的IP地址。
有没有办法
DOCKER_HOST
环境变量可以帮助吗?运行Docker Machine时,它设置为tcp://192.168.99.100:2376
- 这个变量是否也在未运行Docker Machine时使用?我想避免在启动容器(或Docker Compose)时人们必须手动提供IP地址的情况。
答案 0 :(得分:0)
以下是我使用DOCKER_HOST
变量解决这个问题的方法。我的假设是,如果设置了此变量,它将包含主机的IP地址,格式为tcp://192.168.99.100:2367
。
在我的docker-compose.yaml
文件中,我已将主机的DOCKER_HOST
变量映射到容器中:
version: "2"
services:
foo:
environment:
DOCKER_HOST: $DOCKER_HOST
然后在容器中,我将此变量评估为启动容器时运行的脚本的一部分,然后使用它来设置Tomcat的JMX属性:
# Allow to specify the JMX port from the outside. Use 10992 as a default if not provided
DOCKER_JMX_PORT=${DOCKER_JMX_PORT:-10992}
# Evaluate the $DOCKER_HOST variable
if [ -n "DOCKER_HOST" ]; then
# DOCKER_HOST variable is set
DOCKER_JMX_HOST=$(echo "$DOCKER_HOST" | sed -e "s|tcp://||g" -e "s/:.*//g")
else
# DOCKER_HOST variable is not set
DOCKER_JMX_HOST=$(hostname)
fi
# Set the JMX properties for Tomcat
export CATALINA_OPTS="-Dcom.sun.management.jmxremote=true \
-Dcom.sun.management.jmxremote.port=$DOCKER_JMX_PORT \
-Dcom.sun.management.jmxremote.rmi.port=$DOCKER_JMX_PORT \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-Djava.rmi.server.hostname=$DOCKER_JMX_HOST"
如果未设置DOCKER_HOST
环境变量,我假设容器本机运行,例如在Linux上,我使用主机名作为JMX属性。