我有一个运行良好的SpringBoot应用程序。现在,我正在尝试对其进行Dockerise,但是在连接到数据库时遇到了一些问题。
该应用程序有两个数据源:
application.properties
server.port= 8081
# pims datasource
spring.datasource1.driver-class-name=org.postgresql.Driver
spring.datasource1.jdbc-url=jdbc:postgresql://localhost:5432/pims
spring.datasource1.username=postgres
spring.datasource1.password=
spring.jpa.database-platform=postgres
#spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.show-sql=false
# approval datasource
spring.datasource2.driver-class-name=org.postgresql.Driver
spring.datasource2.jdbc-url=jdbc:postgresql://localhost:5432/approval
spring.datasource2.username=postgres
spring.datasource2.password=
在应用程序中,我使用Spring访问两个数据源:
@Configuration
@ComponentScan(basePackages = "com.nexct")
public class MultipleDBConfig {
@Bean(name = "datasource1")
@ConfigurationProperties("spring.datasource1")
@Primary
public DataSource dataSource1(){
return DataSourceBuilder.create().build();
}
@Bean(name = "datasource2")
@ConfigurationProperties("spring.datasource2")
public DataSource dataSource2(){
return DataSourceBuilder.create().build();
}
}
所以我创建了:
Dockerfile
FROM openjdk:14
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} nexct-approval-service.jar
EXPOSE 8081
ENTRYPOINT ["java","-jar","/nexct-approval-service.jar"]
docker-compose.yml
version: '3.7'
services:
product-service:
build: ../nexct-approval-service
volumes:
- ../nexct-approval-service:/usr/src/app
ports:
- "8081:8081"
db:
image: postgres
environment:
POSTGRES_DB_PORT: "5432"
POSTGRES_DB_HOST: "localhost"
POSTGRES_PASSWORD:
POSTGRES_USER: postgres
POSTGRES_DB: pims
但是,我不确定如何配置两个Postgres数据库。
任何建议将不胜感激。
注意:数据库未在容器中运行,因为它们已由其他旧版应用程序使用。
如果我从db
中删除了docker-compose.yml
。当我运行docker-compose up
时,Spring Boot应用程序启动,并且我可以访问RESTful服务。但是,出现以下错误:
PSQLException: Connection to localhost:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.
答案 0 :(得分:0)
尝试配置docker-compose文件以使用桥接网络:
version: '3.7'
services:
product-service:
build: ../nexct-approval-service
volumes:
- ../nexct-approval-service:/usr/src/app
environment:
POSTGRES_DB_PORT: "5432"
POSTGRES_DB_HOST: "localhost"
POSTGRES_PASSWORD:
POSTGRES_USER: postgres
POSTGRES_DB: pims
networks:
- product_service_network
networks:
product_service_network:
driver: bridge
如果要在产品服务容器中使用它们,还必须将ENVIRONMENT
变量移至product-service
。
如果localhost
不起作用,请改用127.0.0.1
。
答案 1 :(得分:0)
version: '3.7'
services:
product-service:
build: ../nexct-approval-service
volumes:
- ../nexct-approval-service:/usr/src/app
ports:
- "8081:8081"
server.port=8081
# pims datasource
spring.datasource1.driver-class-name=org.postgresql.Driver
spring.datasource1.jdbc-url=jdbc:postgresql://<postgres_host_private_ip>:5432/pims
spring.datasource1.username=postgres
spring.datasource1.password=
spring.jpa.database-platform=postgres
#spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.show-sql=false
# approval datasource
spring.datasource2.driver-class-name=org.postgresql.Driver
spring.datasource2.jdbc-url=jdbc:postgresql://<postgres_host_private_ip>:5432/approval
spring.datasource2.username=postgres
spring.datasource2.password=
用托管postgres数据库的计算机的专用IP替换
我不确定您要使用嵌套的 db 服务要实现什么,但是由于您的数据库已经在外部运行,所以不需要这样做。
由于docker隔离,您的Spring应用程序将在与您的主机隔离的网络上运行(除非明确要求使用带network_mode:“ host”的主机网络)。知道“本地主机”不能在容器内工作,您需要使用托管数据库的计算机的真实IP。最可能是192.168.xxx.xxx
此外,您需要确保将postgres配置为接受来自“非本地主机”源的连接(请参见https://www.andrew-kirkpatrick.com/2017/05/allow-connection-postgresql-server-outside-localhost/)。
答案 2 :(得分:0)
要访问在ur Host上运行的应用程序,
<gateway address>:<port>
(即172.28.0.1:<port>
)的容器访问在主机上运行的应用程序version: '3.7'
services:
product-service:
build: ../nexct-approval-service
volumes:
- ../nexct-approval-service:/usr/src/app
ports:
- "8081:8081"
networks:
hostnet: {}
networks:
hostnet:
driver: bridge
ipam:
config:
- subnet: 172.28.0.0/16
network_mode: host
添加到您的服务(仅适用于Linux)localhost:<port>
的容器访问在主机上运行的应用程序使用network_mode:(Linux)
version: '3.7'
services:
product-service:
build: ../nexct-approval-service
volumes:
- ../nexct-approval-service:/usr/src/app
ports:
- "8081:8081"
network_mode: host