一般部署springboot的方式需要在云服务器上安装java,并在开发的机器上打好jar包上传到云服务器上运行,非常麻烦。
通过docker部署springboot工程就能完成在全程在云服务器上打包到运行,不需要其他操作。
但是由于云服务器无法访问外网,在下载maven及其依赖时,踩了不少坑,在此记录。
准备工作
通过idea的spring初始化工具,会在根目录初始化.mvn文件夹
在/.mvn文件夹下有maven-wrapper.jar和maven-wrapper.properties两个文件
用于指定maven的版本,并在本地没有maven时自动根据maven-wrapper.properties中的distributionUrl下载对应版本的maven。
该文件原本为
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.6/apache-maven-3.8.6-bin.zip
wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar
将distributionUrl改为国内下载地址,此处我改为华为云镜像的下载地址,根据云服务提供商选择镜像站地址即可。
distributionUrl=https://mirrors.huaweicloud.com/repository/apache/maven/maven-3/3.8.6/binaries/apache-maven-3.8.6-bin.zip
wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar
做到这步就能够正常下载maven,之后还需要在pom.xml文件中指定maven源,以正常下载依赖
在pom.xml文件中添加,此处添加的是华为云镜像地址
<repositories>
<repository>
<id>central</id>
<url>https://mirrors.huaweicloud.com/repository/maven/</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>central</id>
<url>https://mirrors.huaweicloud.com/repository/maven/</url>
</pluginRepository>
</pluginRepositories>
然而,即使添加了华为云镜像
仍不可避免的有少量依赖项需要到 repo.maven.apache.org 网址下下载
所以建议通过测试ip的网站 ping.chinaz.com/repo.maven.…
寻找延迟最低的ip,测试并替换云服务器中的host 如下
151.101.0.215 repo.maven.apache.org
Dockerfile
之后就可以开始写dockerfile了
多阶段构建,减少最终的image体积
将构建分为两阶段,第一阶段下载maven及依赖,将项目打包为jar包
第二阶段,拷贝jar包,并执行。
# 指定镜像为特定的java8版本
FROM eclipse-temurin:8u362-b09-jdk as builder
WORKDIR /usr/app
COPY ./.mvn/ ./.mvn
COPY mvnw pom.xml ./
# 踩坑 需要为./mvnw文件添加执行权限
RUN chmod +x ./mvnw
# 下载依赖
RUN ./mvnw dependency:go-offline
COPY ./src ./src
# 打包
RUN ./mvnw clean install
FROM eclipse-temurin:8u362-b09-jdk
WORKDIR /usr/app
# 复制jar包
COPY --from=builder /usr/app/target/*.jar /usr/app/*.jar
ENTRYPOINT ["java", "-jar", "/usr/app/*.jar" ]
此处我只拷贝了/src /.mvn /pom.xml /mvnw
启动
之后通过docker命令或docker-compose启动springboot工程即可
docker 先构建image,打标签,以下为各参数解释
docker build -t [docker id/repo name:version] [location]
例如
docker build -t moyin/springboot .
之后直接运行即可,以下为各参数解释 -d 在后台执行 -p 指定端口映射
docker run -d -p [local port]:[container port] [image id]
例如
docker run -d -p 6001:6001 moyin/springboot
该命令会返回容器id,根据该容器id可以查看springboot的运行日志
docker logs [container id]