使用Gradle和Docker部署Spring Boot / PostgreSQL项目

时间:2018-02-14 06:39:31

标签: java postgresql docker spring-boot docker-compose

大家。我在项目部署方面遇到了一些问题,我已经花了几天时间来解决它。 我在堆栈上开发移动后端:

  1. Spring Boot 1.5 + Dev Tools
  2. PostgreSQL
  3. 泊坞
  4. 摇篮
  5. 搬运工-compose.yml

    version: '3'
    services:
        web:
          image: mobilebackend      
          ports:
              - 8088:8080
          depends_on:
              - db
          links:
             - db
        db:
            container_name: transneft_db
            image: postgres
            restart: always
            volumes:
                - transneft_db:/var/lib/postgresql/data
            environment:
                - POSTGRES_PASSWORD=pass
                - POSTGRES_USER=user
                - POSTGRES_DB=db
                - PGDATA=/var/lib/postgresql/data/pgdata
            ports:
                - 54320:5432
        adminer:
            image: adminer
            restart: always
            ports:
                - 8082:8080
    volumes:
        transneft_db: {}
    

    application.properties

    spring.datasource.url=jdbc:postgresql://localhost:54320/db
    spring.datasource.username=user
    spring.datasource.password=pass
    spring.datasource.platform=postgres
    spring.datasource.driver-class-name=org.postgresql.Driver
    
    spring.jpa.database=POSTGRESQL
    spring.jpa.hibernate.ddl-auto=update
    spring.jpa.show-sql=true
    spring.jpa.generate-ddl=true
    spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
    
    jwt.secret =aotransneftsibir
    
    logging.level.org.springframework.web=DEBUG
    logging.level.org.hibernate=ERROR
    

    的build.gradle

    buildscript {
        ext {
            springBootVersion = '1.5.10.RELEASE'
        }
        repositories {
            mavenCentral()
        }
        dependencies {
            classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
            classpath('se.transmode.gradle:gradle-docker:1.2')
        }
    }
    
    apply plugin: 'java'
    apply plugin: 'eclipse'
    apply plugin: 'org.springframework.boot'
    apply plugin: 'docker'
    apply plugin: 'application'
    
    repositories {
        mavenCentral()
    }
    
    compileJava {
        sourceCompatibility = 1.8
        targetCompatibility = 1.8
        mainClassName       = "com.backend.MobilebackendApplication"
    }
    
    jar {
        baseName = "backend-api"
        group    = "com.backend"
        version  = "0.0.1-SNAPSHOT"
        manifest { attributes "Main-Class": "com.backend.mobilebackend.MobilebackendApplication" }
    }
    
    docker {
        baseImage "frolvlad/alpine-oraclejdk8:slim"
        maintainer 'Alex Scrobot "scrobot91@gmail.com"'
    }
    
    dependencies {
        // spring boot
        compile('org.springframework.boot:spring-boot-starter-data-jpa')
        compile('org.springframework.boot:spring-boot-starter-data-rest')
        compile('org.springframework.boot:spring-boot-starter-web')
        runtime('org.springframework.boot:spring-boot-devtools')
    
        //postgresql
        runtime('org.postgresql:postgresql')
    
        //gson
        compile group: 'com.google.code.gson', name: 'gson', version: '2.7'
    
        // JWT
        compile 'io.jsonwebtoken:jjwt:0.9.0'
    
        //test env
        testCompile('org.springframework.boot:spring-boot-starter-test')
        testCompile('org.springframework.security:spring-security-test')
    }
    

    在localhost工作正常,项目正在使用DevTools构建并且工作正常。使用postgresql的Docker容器已启动,我可以使用localhost:port访问与它的连接,一切正常。

    问题已经开始,然后我试着打电话:

    ./gradlew build distDocker --refresh-dependencies

    在这种情况下,属性spring.datasource.url必须包含localhost值,构建将失败。我把localhost值,获得成功消息,该图像构建。所以,然后我尝试用Spring Boot运行容器。我得到连接拒绝错误'。我对这种情况有一些想法:.jar的容器正在运行,它试图通过localhost:db_port获取数据库访问权限,但在此容器内部不能与其localhost进行数据库连接。所以,然后我放入application.property

    spring.datasource.url=jdbc:postgresql://db:54320/db

    但是,我无法构建更新的图像。然后gradle尝试启动组装.jar,它无法访问db:54320,因为boot不在容器中运行,而且正确连接localhost:54320。你觉得我感觉到它的恶性循环吗?))

    我不明白,我做错了什么......请帮我解决这个问题..谢谢。

1 个答案:

答案 0 :(得分:1)

快速而肮脏的解决方案是将127.0.0.2 db放入/ etc / hosts文件中,并使用jdbc:postgresql:// db:54320 / db作为数据库URL并且可以正常工作。

更好的解决方案是为您的应用程序使用构建容器。所以你的docker-compose看起来像这样:

version: '3'
services:
  web:
    image: mobilebackend
    # The value of build refers to a directory at where your compose file is.
    build: mobilebackend
    ...

在mobilebackend目录中,您可以创建如下的Dockerfile:

FROM gradle AS build
RUN gradle build ...

FROM openjdk
COPY --from=build mobilebackend.jar .
RUN java -jar mobilebackend.jar

由于您不需要为此公开数据库端口,您甚至可以使用标准端口:jdbc:postgresql:// db / db

现在您可以使用

编译和运行整个应用程序
docker-compose build
docker-compose up