docker启动tomcat默认是:
Run the default Tomcat server (
CMD ["catalina.sh", "run"]
):
查看tomcat启动脚本catalish.sh
elif [ "$1" = "run" ]; then shift if [ "$1" = "-security" ] ; then if [ $have_tty -eq 1 ]; then echo "Using Security Manager" fi shift eval exec ""$_RUNJAVA"" ""$LOGGING_CONFIG"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS -D$ENDORSED_PROP=""$JAVA_ENDORSED_DIRS"" -classpath ""$CLASSPATH"" -Djava.security.manager -Djava.security.policy==""$CATALINA_BASE/conf/catalina.policy"" -Dcatalina.base=""$CATALINA_BASE"" -Dcatalina.home=""$CATALINA_HOME"" -Djava.io.tmpdir=""$CATALINA_TMPDIR"" org.apache.catalina.startup.Bootstrap "$@" start else eval exec ""$_RUNJAVA"" ""$LOGGING_CONFIG"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS -D$ENDORSED_PROP=""$JAVA_ENDORSED_DIRS"" -classpath ""$CLASSPATH"" -Dcatalina.base=""$CATALINA_BASE"" -Dcatalina.home=""$CATALINA_HOME"" -Djava.io.tmpdir=""$CATALINA_TMPDIR"" org.apache.catalina.startup.Bootstrap "$@" start fi elif [ "$1" = "start" ] ; then if [ ! -z "$CATALINA_PID" ]; then if [ -f "$CATALINA_PID" ]; then if [ -s "$CATALINA_PID" ]; then echo "Existing PID file found during start." if [ -r "$CATALINA_PID" ]; then PID=`cat "$CATALINA_PID"` ps -p $PID >/dev/null 2>&1 if [ $? -eq 0 ] ; then echo "Tomcat appears to still be running with PID $PID. Start aborted." echo "If the following process is not a Tomcat process, remove the PID file and try again:" ps -f -p $PID exit 1 else echo "Removing/clearing stale PID file." rm -f "$CATALINA_PID" >/dev/null 2>&1 if [ $? != 0 ]; then if [ -w "$CATALINA_PID" ]; then cat /dev/null > "$CATALINA_PID" else echo "Unable to remove or clear stale PID file. Start aborted." exit 1 fi fi fi else echo "Unable to read PID file. Start aborted." exit 1 fi else rm -f "$CATALINA_PID" >/dev/null 2>&1 if [ $? != 0 ]; then if [ ! -w "$CATALINA_PID" ]; then echo "Unable to remove or write to empty PID file. Start aborted." exit 1 fi fi fi fi fi shift if [ -z "$CATALINA_OUT_CMD" ] ; then touch "$CATALINA_OUT" catalina_out_command=">> "$CATALINA_OUT" 2>&1" else catalina_out_command="| $CATALINA_OUT_CMD" fi if [ ! -z "$CATALINA_PID" ]; then catalina_pid_file="$CATALINA_PID" else catalina_pid_file=/dev/null fi if [ "$1" = "-security" ] ; then if [ $have_tty -eq 1 ]; then echo "Using Security Manager" fi shift eval { $_NOHUP ""$_RUNJAVA"" ""$LOGGING_CONFIG"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS -D$ENDORSED_PROP=""$JAVA_ENDORSED_DIRS"" -classpath ""$CLASSPATH"" -Djava.security.manager -Djava.security.policy==""$CATALINA_BASE/conf/catalina.policy"" -Dcatalina.base=""$CATALINA_BASE"" -Dcatalina.home=""$CATALINA_HOME"" -Djava.io.tmpdir=""$CATALINA_TMPDIR"" org.apache.catalina.startup.Bootstrap "$@" start 2>&1 & echo $! >"$catalina_pid_file" ; } $catalina_out_command "&" else eval { $_NOHUP ""$_RUNJAVA"" ""$LOGGING_CONFIG"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS -D$ENDORSED_PROP=""$JAVA_ENDORSED_DIRS"" -classpath ""$CLASSPATH"" -Dcatalina.base=""$CATALINA_BASE"" -Dcatalina.home=""$CATALINA_HOME"" -Djava.io.tmpdir=""$CATALINA_TMPDIR"" org.apache.catalina.startup.Bootstrap "$@" start 2>&1 & echo $! >"$catalina_pid_file" ; } $catalina_out_command "&" fi echo "Tomcat started." elif [ "$1" = "stop" ] ; then
可以发现run时并不会输出catalina.out(exec直接启动java),start时才会输出catalina.out(nohup后台启动java);
要想输出catalina.out,一种是tee,一种是重定向,后者脚本如下:
# cat start.sh #!/bin/sh /usr/local/tomcat/bin/catalina.sh run >> /usr/local/tomcat/logs/catalina.out 2>&1
启动命令改为
$ docker run -d -p 8080:8080 -v /dir/start.sh:/usr/local/tomcat/start.sh tomcat:9 sh /usr/local/tomcat/start.sh
即可
参考:
https://hub.docker.com/_/tomcat