springboot with docker

常用的springboot项目中的Dockerfile示例

Dockerfile:利用容器打包并缓存maven

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 拉取编译环境
FROM maven:3.8.3-openjdk-17 as builder
# 创建项目目录
RUN mkdir /project

# 使用项目配置的文件
COPY settings.xml /usr/share/maven/conf/settings.xml

# 拷贝源码到固定的目录,注意前面有个 '.'
COPY ./pom.xml /project/pom.xml

# 切换到源码目录
WORKDIR /project

# 安装依赖
RUN mvn dependency:go-offline

# 复制源代码
COPY ./src /project/src

# 使用maven进行编译
RUN mvn clean package -Dmaven.test.skip=true

# 拉取运行环境,这个镜像打包出的镜像比较小,如需要可换成oracle的jre
FROM openjdk:17

# 从编译好的镜像中将jar拷贝到运行时容器
COPY --from=builder /project/target/xxxx.jar /

# 容器启动时执行的命令,这里可加jvm参数
ENTRYPOINT ["java","-jar","/xxxx.jar"]

# 开放端口,根据自己的配置进行开放
EXPOSE 8080

配套deploy.sh脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash
start=$(date +%s)
cd /data/java_project_dir #切换到java项目所在目录
echo "切换目录"
git pull
echo "更新代码 完成"
docker build . --tag tts
echo "打包镜像 完成"
docker stop tts
echo "停止服务 完成"
docker rm tts
echo "删除容器 完成"
docker run -itd --name=tts -p 28085:8080 tts
echo "启动服务 完成"
docker image prune -f
echo "删除无tag镜像"
end=$(date +%s)
take=$(( end - start ))
echo 操作完成 本次用时:${take}s

安装dnf命令

正常情况下openjdk:17的镜像中是不带有yum或者dnf命令,如果要用上这个命令那就需要安装一下

  • 启动与openjdk:17 对应相同版本的 oracleLinux (查询镜像内的cat /etc/os-release)

    1
    docker run -itd --name=oraclelinux85 oraclelinux:8.5
  • 进入容器

    1
    docker exec -it oraclelinux85 /bin/bash
  • 安装基础包

    1
    yum -y install yum-utils
  • 下载dnf所有程序包(包括依赖),程序会下载所有文件在当前目录下

    1
    repotrack dnf
  • 退出容器 oraclelinux85 ,并复制文件到宿主机

    1
    docker cp oraclelinux85:/root/* ./tmp
  • 复制文件从宿主机到目标容器

    1
    docker cp ./tmp  targetContainer:/root/
  • 进入目标容器安装程序

    1
    2
    3
    4
    docker exec -it targetContainer /bin/bah
    cd /root/
    rpm -Uvh --force --nodeps *.rpm
    rm -rf *.rpm

    最后,愉快的使用dnf命令吧