-
Docker及Jenkins的安装参考 centos7安装docker及jenkins
-
Jenkins的配置参考 使用 Docker 安装 Jenkins 并实现项目自动化部署
-
Dockerfile启动参考 Docker+jenkins+springboot部署
-
docker not found解决参考 docker-in-docker出现docker: command not found的终极解决方案
-
Nginx反向代理Jenkins参考 Docker 安装 jenkins 并添加prefix为nginx配置反向代理
1.脚本式启动方式
-
Jenkins启动命令
docker run -itd -p 8080:8080 -p 50000:50000
-v /usr/local/jenkins:/var/jenkins_home jenkins/jenkins:2.346.3
-
Shell脚本
#!/bin/bash
# 服务名称
SERVER_NAME=jenkins-demo
# 工程所在路径(根据自己情况进行调整)
APP_HOME=$(pwd)
# maven打包后的jar包名
JAR_NAME=jenkins-demo-0.0.1-SNAPSHOT.jar
# jar包的目录
JAR_PATH=${APP_HOME}/target
# 杀死之前的进程
PID_FILE="${APP_HOME}"/"${SERVER_NAME}".pid
if [ -f "${PID_FILE}" ];then
PID=`cat "$PID_FILE"` && kill -9 $PID && echo "kill process "${PID}" finished!"
fi
cd $JAR_PATH
# 修改文件权限
chmod 755 $JAR_NAME
# 启动服务
BUILD_ID=dontKillMe nohup java -jar $JAR_NAME &
# 将新进程ID写到文件中
JAVA_PID=$!
echo "${JAVA_PID}" > "${PID_FILE}"
Jenkins启动以后对项目进行构建,构建成功,但是docker ps命令发现容器内并没有多镜像,还是仅仅只有一个Jenkins,容器内curL访问项目接口可以访问到,但是宿主机上访问不到,除非docker run jenkins的时候添加端口映射,且Jenkins关闭的时候项目也会跟着被关闭
2.Dockerfile启动方式
-
Jenkins启动命令
docker run --name jenkins -u root --rm -d -p 8080:8080 -p 50000:50000
-v /var/jenkins_home:/var/jenkins_home
-v /var/run/docker.sock:/var/run/docker.sock jenkins/jenkins:2.346.3
-
Dockerfile
FROM jdk:8
VOLUME /tmp
ADD target/demo-0.0.1-SNAPSHOT.jar app.jar
EXPOSE 8888
ENTRYPOINT ["java", "-jar", "app.jar", "--spring.profiles.active=dev",
"--server.port=8888", "> /log/app.log"]
-
Shell脚本
cd /var/jenkins_home/workspace/demo //workspace后面跟的名字要和jenkins项目名一致
docker stop demo || true
docker rm demo || true
docker rmi demo || true
docker build -t demo . //-t 指定新镜像名, '.'表示Dockerfile在当前路径
docker run -d -p 8888:8888 --name demo demo:latest
报错如下
[demo] /var/jenkins_home/tools/hudson.tasks.Maven_MavenInstallation/maven3/bin/mvn clean install -Dmaven.test.skpi=true
The JAVA_HOME environment variable is not defined correctly
This environment variable is needed to run this program
NB: JAVA_HOME should point to a JDK not a JRE
Build step 'Invoke top-level Maven targets' marked build as failure
[demo] $ /bin/sh -xe /tmp/jenkins331387188918595394.sh
- cd /var/jenkins_home/workspace/demo
- docker stop demo
/tmp/jenkins331387188918595394.sh: 3: docker: not found- true
- docker rm demo
/tmp/jenkins331387188918595394.sh: 4: docker: not found- true
- docker rmi demo
/tmp/jenkins331387188918595394.sh: 5: docker: not found- true
- docker build -t demo .
/tmp/jenkins331387188918595394.sh: 6: docker: not found
Build step 'Execute shell' marked build as failure
Finished: FAILURE
-
The JAVA_HOME environment variable is not defined correctly
我本以为是JAVA_HOME配错了,还去echo $JAVA_HOME看了一下,然后把echo到的地址配到了Jenkins全局变量里,结果错的离谱,因为我是yum安装的JDK,不需要配JAVA_HOME,而且容器内自带了JDK11,要配也是配容器内的JDK路径
-
/tmp/jenkins*.sh: 3: docker: not found
这个才是真正的报错,我无法在Docker容器内执行docker命令,解决办法:改Jenkins启动命令
docker run -itd -u root -p 8080:8080 -p 50000:50000
--privileged=true //真正获取root权限
-v /var/run/docker.sock:/var/run/docker.sock
//重点是下面这行,因为我是用的Jenkins官方镜像,并非blueocean等,所以需要把二进制文件挂载进去
-v /usr/bin/docker:/usr/bin/docker
-v /home/jenkins:/var/jenkins_home
jenkins/jenkins:2.346.3
-
FROM jdk:8 pull access denied for jdk, repository does not exist or may require 'docker login': denied: requested access to the resource is denied
这个问题改下Dockerfile就行了,因为Jenkins官方镜像自带的是JDK11,把Dockerfile的FROM jdk:8改成FROM openjdk:11就可以。
如果还是报错可能是因为Jenkins全局变量没配置,要配成容器内JDK地址,一般是/opt/java/openjdk,或者可以进容器内echo一下看看
项目启动部分结束
-
Jenkins配置Nginx反向代理
yum方式安装的nginx,一开始仅仅在nginx.conf文件下加了个location,页面无法加载,请求都是404
http{
xxx
xxx
xxx
server{
listen 80;
server_name localhost;
location /jenkins {
proxy_pass http://localhost:8080;
}
}
}
后来查了下应该在Jenkins启动命令上加上请求前缀,然后再改一下nginx.conf就好了
docker run -itd -u root
-p 8080:8080
-p 50000:50000
--privileged=true
-v /etc/localtime:/etc/localtime //解决容器内时区不一致问题
-e TZ=Asia/Shanghai //解决容器内时区不一致问题
-e JENKINS_OPTS="--prefix=/jenkins" //nginx反代配置
-v /var/run/docker.sock:/var/run/docker.sock
-v /usr/bin/docker:/usr/bin/docker
-v /home/jenkins:/var/jenkins_home
jenkins/jenkins:2.346.3
http{
xxx
xxx
xxx
server{
listen 80;
server_name localhost;
location /jenkins {
proxy_pass http://localhost:8080/jenkins;
}
}
}