赞
踩
Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具,起源于Hudson(Hudson是商用的),主要用于持续、自动的构建/测试软件项目、监控外部任务的运行(这个比较抽象,暂且写上,不做解释)。Jenkins用Java语言编写,可在Tomcat等流行的servlet容器中运行,也可独立运行。通常与版本管理工具(SCM)、构建工具结合使用。常用的版本控制工具有SVN、GIT,构建工具有Maven、Ant、Gradle。
jenkins官方文档地址:https://www.jenkins.io/zh/doc/
建议参照官网 使用Maven构建Java应用程序 使用docker安装jenkins,当然也可以参照我的命令安装。
下载Jenkins的Docker镜像:
docker pull jenkins/jenkins:lts
在Docker容器中运行Jenkins:
- docker run \
- -d \
- -it \
- -p 8081:8080 \
- -p 50000:50000 \
- -u root \
- -v /usr/local/jenkins:/var/jenkins_home \
- -v /usr/local/maven:/var/maven_home \
- -v /var/run/docker.sock:/var/run/docker.sock \
- -v /usr/bin/docker:/usr/bin/docker \
- --name jenkins \
- jenkins/jenkins
jenkins docker镜像经常遇到的volume权限问题:
这是因为jenkins容器里面的用户是jenkins,而你的主机用户不是jenkins,就算是root也不行一样报错
方式一:
这个时候我们就需要在主机上面给主机地址赋予权限,赋予它可以访问jenkins容器的权限,jenkins内部用的是uid 1000 的user
chown -R 1000 /root/jenkins_home
再运行jenkins容器就不会报错了
方式二:
在执行docker run命令的时候增加一个-u参数,覆盖容器中内置的帐号,该用外部传入,这里可以传入0代表的是root帐号Id,也可以传入 root
注意挂载-v /var/run/docker.sock:/var/run/docker.sock -v $(which docker):/usr/bin/docker,才可以共享宿主机的docker资源
配置git、jdk、maven等环境
docker jenkins 镜像自带jdk,路径为 /usr/local/openjdk-8
maven 环境我是通过映射主机目录
修改pom.xml配置文件
引入docker依赖
- <properties>
- <docker.image.prefix>zhua-blog</docker.image.prefix>
- </properties>
-
-
- <!-- docker插件 -->
- <plugin>
- <groupId>com.spotify</groupId>
- <artifactId>docker-maven-plugin</artifactId>
- <version>1.0.0</version>
- <configuration>
- <imageName>${docker.image.prefix}/${project.artifactId}</imageName>
- <!--docker文件所在的目录-->
- <dockerDirectory>src/main/docker</dockerDirectory>
- <resources>
- <resource>
- <targetPath>/</targetPath>
- <directory>${project.build.directory}</directory>
- <include>${project.build.finalName}.jar</include>
- </resource>
- </resources>
- </configuration>
- </plugin>
创建dockerfile文件
在src/main/resources/docker 下创建Dockerfile文件
编辑dockerfile文件
- # Docker image for springboot file run
- # VERSION 0.0.1
- # Author: zhua
- # 基础镜像使用java
- FROM java:8
- # 作者
- MAINTAINER zhua <zhua_an@163.com>
- # VOLUME 指定了临时文件目录为/tmp。
- # 其效果是在主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的/tmp
- VOLUME /tmp
- # 将jar包添加到容器中并更名为app.jar
- ADD blog-resource.jar app.jar
- # 运行jar包
- RUN bash -c 'touch /app.jar'
- ENV JAVA_OPTS="-Xms128m -Xmx512m"
- ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]
解释下这个配置文件:
VOLUME 指定了临时文件目录为/tmp。其效果是在主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的/tmp。该步骤是可选的,如果涉及到文件系统的应用就很有必要了。/tmp目录用来持久化到 Docker 数据文件夹,因为 Spring Boot 使用的内嵌 Tomcat 容器默认使用/tmp作为工作目录
项目的 jar 文件作为 “app.jar” 添加到容器的
ENTRYPOINT 执行项目 app.jar。为了缩短 Tomcat 启动时间,添加一个系统属性指向 “/dev/./urandom” 作为 Entropy Source
如果是第一次打包,它会自动下载java 8的镜像作为基础镜像,以后再制作镜像的时候就不会再下载了。
配置构建环境,构建命令(不需要加 mvn 命令)如下:
clean package -Dmaven.test.skip=true docker:build
代码上传git/svn,配置源码管理等其他配置后,主要配置镜像构建后操作,比如停止容器、删除容器、删除所有无名称的镜像、启动镜像,如下图:
docker镜像 shell 执行命令:
- #!/bin/bash
- #-ilex
-
- imagesName="zhua-blog/blog-resource"
- echo "镜像名 ${imagesName}"
- containerid=`docker ps|grep ${imagesName} |awk '{print $1}'`
- imagesid=`docker images|grep -i ${imagesName}|awk '{print $3}'`
-
- #判断是否存在zhua-blog/blog-resource容器
- if [[ ${containerid} -ne 0 ]]; then
- echo "${imagesName} 准备 shutdown 容器"
- docker stop ${imagesName}
- sleep 5
- echo "${imagesName} 准备删除容器"
- docker rm ${imagesName}
- else
- containerid=`docker container ls -a|grep ${imagesName} |awk '{print $1}'`
- if [[ ${containerid} -ne 0 ]]; then
- echo "${imagesName} 未启动"
- echo "${imagesName} 准备 删除"
- docker rm ${imagesName}
- else
- echo "${imagesName} 容器不存在"
- fi
-
- fi
-
- echo "启动镜像 ${imagesName}"
- docker run -d -it -p 8888:8888 --name zhua-blog ${imagesName}
-
- #sleep 1 #等3秒后执行下一条
-
- #Docker 删除所有无名称的镜像(悬空镜像)
- echo "删除所有无名称的镜像"
- docker rmi $(docker images -f "dangling=true" -q)
-
- echo "镜像操作完成..."
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。