简体   繁体   中英

Jenkins not starting in docker (Dockerfile included)

I am attempting to build a simple app with Jenkins in a docker container. I have the following Dockerfile:

FROM ubuntu:trusty

# Install dependencies for Flask app.
RUN sudo apt-get update
RUN sudo apt-get install -y vim
RUN sudo apt-get install -y curl 
RUN sudo apt-get install -y python3-pip
RUN pip3 install flask

# Install dependencies for Jenkins (Java).
        # Install Java 1.8.
RUN sudo apt-get install -y python-software-properties debconf-utils
RUN sudo apt-get install -y software-properties-common
RUN sudo add-apt-repository -y ppa:webupd8team/java
RUN sudo apt-get update
RUN echo "oracle-java8-installer shared/accepted-oracle-license-v1-1 select true" | sudo debconf-set-selections
RUN sudo apt-get install -y oracle-java8-installer
        # Install, start Jenkins.
RUN sudo apt-get install -y wget
RUN wget -q -O - https://pkg.jenkins.io/debian/jenkins-ci.org.key | apt-key add -
RUN echo deb http://pkg.jenkins-ci.org/debian binary/ > /etc/apt/sources.list.d/jenkins.list
RUN sudo apt-get update
RUN sudo apt-get install -y jenkins
RUN sudo /etc/init.d/jenkins start

COPY ./app /app

CMD ["python3","/app/main.py"]

I run this container with the following:

docker build -t jenkins_test .
docker run --name jenkins_test_container -tid -p 5000:5000 -p 8080:8080 jenkins_test:latest

I am able to start flask and install Jenkins, however, when running, Jenkins is not running. curl localhost:8080 is not successful.

In the log output, I am able to see:

Correct java version found
 * Starting Jenkins Automation Server jenkins [ OK ] 

However, it's still not running.

I can ssh into the container and manually run sudo /etc/init.d/jenkins start to start it, but I want it to start on docker run or docker build .

I have also tried putting sudo /etc/init.d/jenkins start in the CMD portion of the Docker file:

CMD python3 /app/main.py; sudo /etc/init.d/jenkins start

With this, I am able to curl Flask, but still not Jenkins.

How can I get Jenkins to start automatically?

You have some points that you need to be aware of:

  1. No need to use sudo as the default user is root already.
  2. In order to run multiple service in the same container you need to use any kind of service manager like Supervisord . Jenkins is not running because the CMD is the main entry point for your container so only flask should be running. Check the following link in order to know how to start multiple service in docker.

    RUN will be executed only during the build process unlike CMD which will be executed each time you start a container from that image.

  3. Combine all the RUN lines together as possible in order to minimize the build layers which lead to a smaller docker image.

Regarding the usage of this:

CMD python3 /app/main.py; sudo /etc/init.d/jenkins start

It does not work for you because this command python3 /app/main.py is not running as a background process so this command sudo /etc/init.d/jenkins start wont run until the previous command is done.

I was only able to get this to work by starting Jenkins in the CMD portion, but needed to start Jenkins before Flask since Flask would continuously run and the next command would never execute:

Did not work:

CMD python3 /app/main.py; sudo /etc/init.d/jenkins start

This did work:

CMD sudo /etc/init.d/jenkins start; python3 /app/main.py

EDIT:

I believe putting it in the RUN portion would not work because container would build but not save the any running services. I'm not sure if containers can be saved and loaded with running processes like that but I might be wrong. Would appreciate clarification if so.

It seems like a thing that should be in RUN so if anyone knows why that didn't work or some best practices, would also appreciate the info.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM