使用PostgreSQL的Spring Boot应用程序的Docker Compose

在这篇博文中,你将学习如何配置带有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
  • 我们将有两个servicesdb ,用于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

参考文献

另见

猜你喜欢

转载自juejin.im/post/7125711994287554591