我正在尝试在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 run
或docker build
上启动。
我还尝试将sudo /etc/init.d/jenkins start
放入Docker文件的CMD
部分:
CMD python3 /app/main.py; sudo /etc/init.d/jenkins start
有了这个,我可以卷曲Flask了,但仍然不能让Jenkins卷曲。
如何让Jenkins自动启动?
答案 0 :(得分:1)
您需要注意一些要点:
sudo
,因为默认用户已经是root。CMD
是容器的主要入口点,因此仅应运行flask。检查以下link以了解如何在docker中启动多个服务。
RUN
仅在构建过程中执行,与CMD
不同,RUN
每次您从该映像启动容器时都会执行。
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
中,因此,如果有人知道为什么这样不起作用或某些最佳做法,也希望了解这些信息。