参考资料
手把手教你使用 Jenkins+Docker+Tomcat 自动化部署项目(2022最新)
Gitee令牌
Docker+Jenkins+Gitee自动化部署maven项目_docker运行maven_fkjavaer的博客-CSDN博客
安装maven教程 | 3.9.3版本maven下载
# 使用docker官方镜像拉取
docker search jenkins/jenkins
docker pull jenkins/jenkins
mkdir -p /root/docker-jenkins/home
# 映射本地数据卷时,docker-jenkins目录的拥有者变成了root用户,会出现Permission denied 的问题,无法启动
# 当前目录的拥有者赋值给uid 1000
# https://www.cnblogs.com/jackluo/p/5783116.html
chown -R 1000 /root/docker-jenkins/
docker run -d \
-p 5200:8080 \
-p 50000:50000 \
--restart=always \
-m 2g \
-uroot \
-v /root/docker-jenkins/home:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/bin/docker:/usr/bin/docker \
--name jenkins \
jenkins/jenkins
docker logs -f jenkins
或在jenkins直接安装(没试过),或在宿主机安装使用数据卷挂载过去
# 如果前面指定root运行,则无需再次指定
# 进入容器
docker exec -u 0 -it jenkins /bin/bash
不进入容器,在宿主机操作一套带走
# 宿主机上执行(二选一,推荐)
docker exec jenkins mkdir -p /usr/local/maven /usr/local/maven/repository
# 容器内执行(二选一)
mkdir -p /usr/local/maven && mkdir -p /usr/local/maven/repository
报错: (No such file or directory) and ‘parent.relativePath’ points at no local POM
docker exec jenkins chmod -R o+r+w /usr/local/maven && docker exec jenkins chmod o+x+w /usr/local/maven
将宿主机的maven安装包拷贝到容器内(也可使用数据卷挂载)
find / -name apache-maven*.tar.gz | xargs -I {} docker cp {} jenkins:/usr/local/maven
docker exec jenkins /bin/bash -c 'cd /usr/local/maven && tar -zxvf $(find / -name apache-maven*.tar.gz)'
mave 仓库配置
vim ~/settings.xml
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.2.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 https://maven.apache.org/xsd/settings-1.2.0.xsd">
<!-- 注意仓库地址repository与上面的目录对应 -->
<localRepository>/usr/local/maven/repository</localRepository>
<pluginGroups>
</pluginGroups>
<proxies>
</proxies>
<servers>
</servers>
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
<profiles>
</profiles>
</settings>
将宿主机修改的settings.xml拷贝至容器内(这里我放在了宿主机/root
下)
docker cp /root/settings.xml jenkins:/usr/local/maven/apache-maven-3.9.3/conf
提示Permission denied
,进入容器切换root用户sudo -i
或以root身份进入容器docker exec -u 0 xxx
clean package -Dmaven.test.skip=true
bash /var/jenkins_home/workspace/${JOB_NAME}/deploy.sh ${JOB_NAME} master
deploy.sh
#!/bin/bash
SERVER_NAME=$1
IMAGE_TAG=$2
IMAGE_NAME=$SERVER_NAME:$IMAGE_TAG
SERVER_PORT=$(find . -type d -name "target" -prune -o -type f -name "application.yml" -exec grep -A1 "server:" {} \; | awk '/port:/ {print $2}')
echo "------ 开始构建镜像:${SERVER_NAME} ------"
docker build -t ${IMAGE_NAME} .
echo -e "------ 镜像构建结束 | 镜像名:${IMAGE_NAME} ------\n"
if [[ -n $(docker ps -q -f "name=^${SERVER_NAME}$") ]];then
echo "------ 容器正在运行:${SERVER_NAME} ------"
echo "------ 停止容器:$SERVER_NAME ------"
docker stop $SERVER_NAME
echo "------ 删除容器:$SERVER_NAME ------"
docker rm $SERVER_NAME
else
echo "------ 容器未在运行:${SERVER_NAME} ------"
echo "------ 删除容器:$SERVER_NAME ------"
docker rm $SERVER_NAME
fi
echo "------ 开始运行容器:$SERVER_NAME ------"
# 这里宿主机端口及容器端口保持一致
docker run -d --name $SERVER_NAME -p $SERVER_PORT:$SERVER_PORT ${IMAGE_NAME}
echo -e "------ 容器:$SERVER_NAME 运行成功!------"
echo "------ 清理虚悬镜像 ------"
if [[ -n $(docker images | grep "none" | awk '{print $3}') ]];then
docker rmi -f $(docker images | grep "none" | awk '{print $3}')
fi
Dockerfile
FROM openjdk:8-jre as builder
WORKDIR apps
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} application.jar
RUN java -Djarmode=layertools -jar application.jar extract
# -------------------------------------------------------------
FROM openjdk:8-jre
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone
WORKDIR apps
COPY --from=builder apps/dependencies/ ./
COPY --from=builder apps/spring-boot-loader/ ./
COPY --from=builder apps/snapshot-dependencies/ ./
COPY --from=builder apps/application/ ./
ENTRYPOINT java ${JAVA_OPTS} org.springframework.boot.loader.JarLauncher