在这篇博文中,你将学习如何配置带有PostgreSQL的Spring Boot应用程序,以便在Docker Compose中运行。
这篇博文涵盖了:
- Spring Boot应用程序
Dockerfile,并在依赖关系和资源之间进行清洁分离的配置 Docker Compose使用PostgreSQL运行应用程序的配置
先决条件
- Docker
- Java 13
- 终端
- httpie(或curl)
应用程序
- 生成基于Maven的Spring Boot应用程序,包括
Spring Web,Spring Data JPA,Spring Data REST,PostgreSQL JDBC Driver的依赖关系。 - 添加Testcontainers,在集成测试中使用dockerized数据库。你可以在这篇文章中阅读更多关于使用Testcontainers与Spring Boot的信息。使用Testcontainers和PostgreSQL、MySQL或MariaDB的Spring Boot测试
这篇文章的源代码可以在Github上找到:https://github.com/kolorobot/spring-boot-tc
Dockerfile
- 创建
Dockerfile - 基础Docker镜像使用
AlpineLinux:
FROM openjdk:13-alpine
- 不要以
root的方式运行该应用程序:
RUN addgroup -S spring && adduser -S spring -G spring
USER spring:spring
- 不要将fat-jar部署到容器中,而是将依赖关系和应用程序的类和资源分成不同的层:
ARG DEPENDENCY=target/dependency
COPY ${DEPENDENCY}/BOOT-INF/lib /app/lib
COPY ${DEPENDENCY}/META-INF /app/META-INF
COPY ${DEPENDENCY}/BOOT-INF/classes /app
注意:
ARG,如果你有基于Gradle的项目,可以用它来调整目录。docker build --build-arg DEPENDENCY=build/dependency -t spring-boot-tc .
- 通过在
java命令中指向主类和libs,在容器内运行应用程序:
ENTRYPOINT ["java","-cp","app:app/lib/*","pl.codeleak.samples.springboot.tc.SpringBootTestcontainersApplication"]
完整的Dockerfile:
FROM openjdk:13-alpine
RUN addgroup -S spring && adduser -S spring -G spring
USER spring:spring
ARG DEPENDENCY=target/dependency
COPY ${DEPENDENCY}/BOOT-INF/lib /app/lib
COPY ${DEPENDENCY}/META-INF /app/META-INF
COPY ${DEPENDENCY}/BOOT-INF/classes /app
ENTRYPOINT ["java","-cp","app:app/lib/*","pl.codeleak.samples.springboot.tc.SpringBootTestcontainersApplication"]
初次接触Docker? 12分钟内解释Docker:https://www.youtube.com/watch?v=YFl2mCHdv24
Docker Compose
- 创建
docker-compose.yml - 我们将有两个
services:db,用于PostgreSQL数据库,app,用于应用程序db服务将使用公共资源库中的 镜像,它将把端口 暴露给主机,它将把环境属性 传递给容器以设置数据库名称、用户和密码。postgres5432POSTGRES_*app服务将使用我们先前创建的本地构建,它将向主机暴露端口 ,它将传递环境属性,覆盖应用程序的数据源配置( )。 服务将依赖于 服务。数据源URL使用 作为主机名,它反映了 服务的名称。9000``application.propertiesappdbdbdb
完整的docker-compose.yml:
version: '3'
services:
db:
image: "postgres"
ports:
- "5432:5432"
environment:
POSTGRES_DB: tc
POSTGRES_USER: tc
POSTGRES_PASSWORD: tc
app:
build: .
ports:
- "9000:8080"
environment:
SPRING_DATASOURCE_URL: jdbc:postgresql://db/tc
SPRING_DATASOURCE_USERNAME: tc
SPRING_DATASOURCE_PASSWORD: tc
depends_on:
- db
新近接触Docker Compose?Docker Compose的12分钟解释:https://www.youtube.com/watch?v=Qw9zlE3t8Ko
运行应用程序
- 将应用程序打包
$ ./mvnw clean package
要跳过测试,请使用。
-DskipTests=true
- 将库从
fat-jar
$ mkdir -p target/dependency && (cd target/dependency; jar -xf ../*.jar)
- 运行时使用
docker-compose
$ docker-compose build && docker-compose up
- 验证应用程序正在运行并对请求做出响应
$ http get :9000/owners
HTTP/1.1 200
Connection: keep-alive
{
"_embedded": {
"owners": []
},
"_links": {
"profile": {
"href": "http://localhost:8080/profile/owners"
},
"self": {
"href": "http://localhost:8080/owners{?page,size,sort}",
"templated": true
}
},
"page": {
"number": 0,
"size": 20,
"totalElements": 0,
"totalPages": 0
}
}
源代码
本文的源代码可以在Github上找到:https://github.com/kolorobot/spring-boot-tc