在这篇博文中,你将学习如何配置带有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镜像使用
Alpine
Linux:
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
服务将使用公共资源库中的 镜像,它将把端口 暴露给主机,它将把环境属性 传递给容器以设置数据库名称、用户和密码。postgres
5432
POSTGRES_*
app
服务将使用我们先前创建的本地构建,它将向主机暴露端口 ,它将传递环境属性,覆盖应用程序的数据源配置( )。 服务将依赖于 服务。数据源URL使用 作为主机名,它反映了 服务的名称。9000``application.properties
app
db
db
db
完整的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