spring-boot Docker 部署
环境
docker 18.09.7-ce
spring-boot 2.1.6.RELEASE
JDK 1.8
开始
- 从
https://start.spring.io/
下载一个demo,只依赖web
模块,导入IDE. - 写点测试代码
@SpringBootApplication
@RestController
@RequestMapping("/demo")
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@GetMapping
public String home(){
return "home";
}
}
spring.jackson.time-zone=GMT+8
spring.jackson.date-format=yyyy-MM-dd HH:mm
- 编写
Dockerfile
FROM gcr.azk8s.cn/distroless/java
VOLUME /tmp
ADD app.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","app.jar"]
- 将测试代码打包为可执行jar文件。并执行Docker build命令。
sudo docker build -t demo-app:1.0 -f ./BootDockerfile ./
# demo-app 打包仓库名
# 1.0 打包tag
# ./BootDockerfile 指定Dockerfile
# ./ 指定可执行jar 目录
- 查看docker 镜像
sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
demo-app 1.0 f2b2c312684d 5 seconds ago 142MB
- 执行并测试
sudo docker run -p 8080:8080 -t demo-app:1.0
常见问题
基础镜像,网上一些资源使用的是
java:8
,但是生成的镜像400多M实在有点大。所以我使用了Google 开源的项目distroless
。Distroless
镜像只包含应用程序及其运行时依赖项,不包含包管理器、shell 以及在标准 Linux 发行版中可以找到的任何其他程序。
Distroless
镜像网络问题,直接使用gcr.io/distroless/java
,docker构建镜像是无法下载所以使用了,开源社开源镜像站点
时区问题
Distroless
镜像不包含linux 发行版中的任何其他程序,所以
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' > /etc/timezone
命令设置时区不好使。
修改Dockerfile
ENTRYPOINT ["java","-Duser.timezone=GMT+8","-jar","app.jar"]
编码问题
保存到数据库内容全部为???
修改Dockerfile
ENTRYPOINT ["java","-Duser.timezone=GMT+8","-Dfile.encoding=utf-8","-jar","app.jar"]