gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 03:32:00 27 4
gpt4 key购买 nike

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

  1. Spring Boot 1.5 + 开发工具
  2. PostgreSQL
  3. jetty worker
  4. Gradle

docker-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')
}

在本地主机上运行良好,项目正在使用 DevTools 构建并且运行良好。带有 postgresql 的 Docker 容器已启动,我可以使用 localhost:port 访问到它的连接,一切正常。

问题开始了,然后我尝试调用:

./gradlew build distDocker --refresh-dependencies

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

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

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

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

最佳答案

快速而肮脏的解决方案是将 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

关于java - 使用 Gradle 和 Docker 部署 Spring Boot/PostgreSQL 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48781110/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com