Jenkins没有在Docker中启动(包括Dockerfile)

时间:2019-02-23 12:15:25

标签: docker jenkins

我正在尝试在Docker容器中使用Jenkins构建一个简单的应用程序。我有以下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"]

我使用以下命令运行此容器:

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

我能够启动flask并安装Jenkins,但是,在运行时,Jenkins没有运行。 curl localhost:8080不成功。

在日志输出中,我可以看到:

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

但是,它仍然没有运行。

我可以装入容器并手动运行sudo /etc/init.d/jenkins start来启动它,但是我希望它在docker rundocker build上启动。

我还尝试将sudo /etc/init.d/jenkins start放入Docker文件的CMD部分:

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

有了这个,我可以卷曲Flask了,但仍然不能让Jenkins卷曲。

如何让Jenkins自动启动?

2 个答案:

答案 0 :(得分:1)

您需要注意一些要点:

  1. 无需使用sudo,因为默认用户已经是root。
  2. 为了在同一容器中运行多个服务,您需要使用任何类型的服务管理器,例如Supervisord。 Jenkins未运行,因为CMD是容器的主要入口点,因此仅应运行flask。检查以下link以了解如何在docker中启动多个服务。
      

    RUN仅在构建过程中执行,与CMD不同,RUN每次您从该映像启动容器时都会执行。

  3. 将所有CMD python3 /app/main.py; sudo /etc/init.d/jenkins start 行合并在一起,以最小化可减少docker映像的构建层。

关于此用法:

python3 /app/main.py

该命令对您不起作用,因为该命令sudo /etc/init.d/jenkins start并未作为后台进程运行,因此该命令JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); File classesFolder = new File(TestFile.class.getProtectionDomain().getCodeSource().getLocation().getFile()); List<String> optionList = new ArrayList<String>(); //Adding the classpath to the OptionList optionList.addAll(Arrays.asList("-classpath", System.getProperty("java.class.path") + ";" + Settings.projectPath + "WEB-INF/classes/;" + classesFolder.getAbsolutePath() )); CompilationTask task = compiler.getTask(null, fileManager, diagnostics, optionList, null, files); //a task is initialized with the values previously specified and saved task.call(); 直到上一个命令完成后才会运行。

答案 1 :(得分:0)

我只能通过在CMD部分中启动Jenkins来使其工作,但是需要在Flask之前启动Jenkins,因为Flask会连续运行并且下一条命令将永远不会执行:

不起作用:

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

这确实有效:

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

编辑:

我相信将其放在RUN部分中是行不通的,因为容器可以构建但不会保存任何正在运行的服务。我不确定容器是否可以保存和加载正在运行的进程,但是我可能是错的。如果是这样,请您澄清一下。

{em> 应该放在RUN中,因此,如果有人知道为什么这样不起作用或某些最佳做法,也希望了解这些信息。