1、在工程 pom.xml中添加docker编译插件
<!-- docker-maven 插件,用于打包docker镜像 -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>${docker-maven-plugin.version}</version>
<configuration>
<!--镜像名称-->
<imageName>${project.artifactId}</imageName>
<!-- dockerfile目录-->
<dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
<buildArgs>
<JAR_FILE>${project.artifactId}.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>
2、在工程 src/main/docker下创建DockerFile
FROM openjdk:8u222-jre-stretch
VOLUME /tmp
RUN groupadd -g 2046 fuli && useradd -d /home/fuli -m -u 2046 -g fuli fuli \
&& mkdir /data \
&& mkdir /app \
&& ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo 'Asia/Shanghai' >/etc/timezone
ARG JAR_FILE
ADD ${JAR_FILE} /app/app.jar
WORKDIR /app
RUN chmod 777 /app
RUN chmod 777 /data
USER 2046
ENV JAVA_OPTS=""
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app/app.jar" ]
3、Jekins 配置
需要注意的点:
构建时先要打包编译父pom工程,如下:
再编译具体工程,如下:
3.1 添加 Excute Shell 打包并上传镜像
# 镜像打包,发布到远程仓库
#!/bin/bash
# 镜像名称
old_image=admin-test
#环境标识,联调环境:dev,测试环境:test,演示环境:beta,生产环境:prod
env_label="test"
tag=$(date "+%Y%m%d")"-"$env_label
# 镜像仓库地址、帐号、密码
registry_addr=172.1.1.1
registry_uname=admin
registry_paw=admin
# docker仓库里创建的项目名
registry_project_name=group
new_image=$registry_addr/$registry_project_name/$old_image:$tag
# 给镜像打标签
docker tag $old_image $new_image
# 登录镜像仓库
docker login --username=$registry_uname --password=$registry_paw $registry_addr
# push image
docker push $new_image
# 删除 latest 镜像
docker rmi $old_image
3.2 添加 Execute shell script on remote host using ssh 拉取镜像并执行启动
#!/bin/bash
#宿主机ip
client_ip=172.1.1.8
# 镜像仓库地址、帐号、密码
registry_addr=172.1.1.1
registry_uname=admin
registry_paw=admin
#环境标识,联调环境:dev,测试环境:test,演示环境:beta,生产环境:prod
env_label="dev"
tag=$(date "+%Y%m%d")"-"$env_label
# 项目名称,对应pom.xml里的项目名称
project_name="test"
# docker仓库里创建的项目名
registry_project_name=group
# 镜像名称
img_name=$registry_addr/$registry_project_name/$project_name:$tag
echo "$img_name"
# 查看进程是否存在,停止容器
exist=`docker inspect --format '{{.State.Running}}' ${project_name}`
if [ "${exist}" == "true" ]; then
docker stop ${project_name}
#记录日志
echo "停止容器,容器名称:${project_name}"
fi
# 删除容器
for i in [ `docker ps -a --format "{{.Names}}"` ]; do
if [[ $i == ${project_name} ]]; then
echo "删除容器${project_name} "
docker rm $i
break
fi
done
img_name_t=$registry_addr/$registry_project_name/$project_name
# 删除镜像
for i in [ `docker images | grep -w $img_name_t | awk '{print $1}' ` ]; do
if [[ $i == ${img_name_t} ]]; then
echo "删除镜像${img_name_t}"
#删除镜像
docker rmi -f $i
break
fi
done
# 登录阿里云镜像仓库
docker login --username=$registry_uname --password=$registry_paw $registry_addr
# 拉取镜像
docker pull $img_name
# 删除空镜像
docker rmi $(docker images | grep "none" | awk '{print $3}')
# 运行
docker run --name=$project_name --restart=always -m 1G -d -t \
-p 7002:7002 \
-e "SPRING_PROFILES_ACTIVE=${env_label}" \
-e "SPRING_CLOUD_SENTINEL_TRANSPORT_CLIENTIP=${client_ip}" \
-e "SPRING_CLOUD_NACOS_DISCOVERY_IP=${client_ip}" \
$img_name
上面的关键步骤已有;
完整的如下图,仅供参考: