在此博客文章中,您将学习如何使用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
也可以看看
- 使用JUnit 5进行Spring Boot测试
- macOS:(Java)开发人员必备工具
翻译自: https://www.javacodegeeks.com/2020/03/docker-compose-for-spring-boot-application-with-postgresql.html