在此博客文章中,您将学习如何使用PostgreSQL配置Spring Boot应用程序以与Docker Compose一起运行。
这篇博客文章涵盖:
- Spring Boot应用程序
Dockerfile
配置,在依赖关系和资源之间进行了清晰的分离 - 用于通过PostgreSQL运行应用程序的
Docker Compose
配置
先决条件
- 码头工人
- Java 13
- 终奌站
- httpie(或curl)
应用
- 使用
Spring Web
,Spring Data JPA
,Spring Data REST
,PostgreSQL JDBC Driver
依赖项生成基于Maven的Spring Boot应用PostgreSQL JDBC Driver
。
可以在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
- 不要将胖子容器部署到容器中,而是将依赖项,应用程序类和资源拆分到单独的层中:
ARG DEPENDENCY=target/dependency COPY ${DEPENDENCY}/BOOT-INF/lib /app/lib COPY ${DEPENDENCY}/META-INF /app/META-INF COPY ${DEPENDENCY}/BOOT-INF/classes /app
注意:如果您有基于Gradle的项目,则可以使用ARG
来调整目录: docker build --build-arg DEPENDENCY=build/dependency -t spring-boot-tc .
- 通过在
java
命令中指向主类和库,在容器内运行应用程序:
ENTRYPOINT [ "java" , "-cp" ENTRYPOINT [ "-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" ENTRYPOINT [ "-cp" , "app:app/lib/*" , "pl.codeleak.samples.springboot.tc.SpringBootTestcontainersApplication" ]
Docker新手? Docker在12分钟内进行了解释: https : //www.youtube.com/watch?v = YFl2mCHdv24
Docker撰写
- 创建
docker-compose.yml
- 我们将提供两项
services
:db
用于PostgreSQL数据库和app
用于应用程序db
服务将使用公共存储库中的postgres
映像,它将向主机公开端口5432
,并将环境属性POSTGRES_*
传递给容器以设置数据库名称,用户和密码。
完整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
参考文献
- https://spring.io/guides/gs/spring-boot-docker/
- https://openliberty.io/blog/2018/06/29/optimizing-spring-boot-apps-for-docker.html