Apache Tomcat 8 not starting within a docker container

11,804

Looking at the docker run command documentation, the doc states that any command passed to the run will override the original CMD in your Dockerfile:

As the operator (the person running a container from the image), you can override that CMD instruction just by specifying a new COMMAND

1/ Then when you run:

docker run -d -p 8082:8080 imageid tail -f /dev/null

The container is run with COMMAND tail -f /dev/null, the original command starting tomcat is overridden.

To resolve your problem, try to run:

docker run -d -p 8082:8080 imageid

and

docker log -f containerId

To see if tomcat is correctly started.

2/ You should not use the start argument with catalina.sh. Have a look at this official tomcat Dokerfile, the team uses :

CMD ["catalina.sh", "run"]

to start tomcat (when you use start, docker ends container at the end of the shell script and tomcat will start but not maintain a running process).

3/ Finally, why don't you use tomcat official image to build your container? You could just use the :

FROM tomcat:latest

directive at the beginning of your Dockerfile, and add you required elements (new files, webapps war, settings) to the docker image.

Share:
11,804
Arindam
Author by

Arindam

Updated on June 12, 2022

Comments

  • Arindam
    Arindam almost 2 years

    I am experimenting with Docker and am very new to it. I am struck at a point for a long time and am not getting a way through and hence came up with this question here...

    Problem Statement: I am trying to create an image from a docker file containing Apache and lynx installation. Once done I am trying to access tomcat on 8080 of the container which is in turn forwarded to the 8082 of the host. But when running the image I never get tomcat started in the container.

    The Docker file

    FROM ubuntu:16.10
    #Install Lynx
    Run apt-get update
    Run apt-get install -y lynx
    
    #Install Curl
    Run apt-get install -y curl
    
    #Install tools: jdk
    Run apt-get update
    Run apt-get install -y openjdk-8-jdk wget
    
    #Install apache tomcat
    Run groupadd tomcat
    Run useradd -s /bin/false -g tomcat -d /opt/tomcat tomcat
    Run cd /tmp
    Run curl -O http://apache.mirrors.ionfish.org/tomcat/tomcat-    8/v8.5.12/bin/apache-tomcat-8.5.12.tar.gz
    Run mkdir /opt/tomcat
    Run tar xzvf apache-tomcat-8*tar.gz -C /opt/tomcat --strip-components=1
    Run cd /opt/tomcat
    Run chgrp -R tomcat /opt/tomcat
    Run chmod -R g+r /opt/tomcat/conf
    Run chmod g+x /opt/tomcat/conf
    Run chown -R tomcat /opt/tomcat/webapps /opt/tomcat/work /opt/tomcat/temp opt/tomcat/logs
    
    Run cd /opt/tomcat/bin
    
    Expose 8080
    CMD /opt/tomcat/bin/catalina.sh run && tail -f /opt/tomcat/logs/catalina.out
    

    When the image is built I tried running the container by the two below methods

    1. docker run -d -p 8082:8080 imageid tail -f /dev/null While using the above, container is running but tomcat is not started inside the container and hence not accessible from localhost:8082. Also I do not see anything if I perform docker logs longcontainerid

    2. docker run -d -p 8082:8080 imageid /path/to/catalina.sh start tail -f /dev/null I see tomcat started when I do docker logs longconatainrid While using the above the container is started and stopped immediately and is not running as I can see from docker ps and hence again not accessible from localhost:8082.

    Can anyone please tell me where I am going wrong?

    P.s. I searched a lot on the internet but could not get the thing right. Might be there is some concept that i am not getting clearly.