Arindam
Arindam

Reputation: 71

Apache Tomcat 8 not starting within a docker container

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.

Upvotes: 4

Views: 13857

Answers (1)

François Maturel
François Maturel

Reputation: 6162

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.

Upvotes: 6

Related Questions