当 Docker 容器中的 Spring Boot 应用程序尝试访问 Keycloak Docker 容器时,我遇到问题。我使用 docker-compose 创建了它们。以下是文件:
version: "3.8"
services:
psql-db:
image: postgres
container_name: psql-db
restart: always
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=xxx
- POSTGRES_DB=postgres
ports:
- '5432:5432'
remind-me:
container_name: remind-me-app
build:
context: .
dockerfile: Dockerfile
ports:
- '8080:8080'
environment:
- SPRING_DATASOURCE_URL=jdbc:postgresql://psql-db:5432/postgres
- SPRING_DATASOURCE_USERNAME=postgres
- SPRING_DATASOURCE_PASSWORD=xxx
- KEYCLOAK_URL=http://keycloak-prod:8989/realms/remind-me
depends_on:
- psql-db
keycloak-prod:
image: quay.io/keycloak/keycloak:24.0.2
container_name: keycloak-prod
hostname: keycloak-prod
environment:
- KEYCLOAK_ADMIN=admin
- KEYCLOAK_ADMIN_PASSWORD=xxx
command: start-dev
ports:
- '8989:8080'
Spring Boot 应用程序中的 applrication.properties 文件:
spring.application.name=remind-me
server.port=8080
spring.datasource.url=jdbc:postgresql://localhost:5432/postgres
spring.datasource.username=postgres
spring.datasource.password=xxx
spring.jpa.hibernate.ddl-auto=validate
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.show-sql=true
spring.jpa.defer-datasource-initialization=false
spring.sql.init.mode=always
spring.jpa.properties.hibernate.format_sql=true
logging.level.org.hibernate.orm.jdbc.bind=TRACE
schedule.frequency=0 0 9 * * *
#John Remindme
spring.mail.host=xxx
spring.mail.port=587
spring.mail.username=xxx
spring.mail.password=xxx
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
#keycloak
spring.security.oauth2.resourceserver.jwt.issuer-uri=${KEYCLOAK_URL}
spring.security.oauth2.resourceserver.jwt.jwk-set-uri=${KEYCLOAK_URL}/protocol/openid-connect/certs
jwt.auth.converter.resource-id=remind-me
jwt.auth.converter.principal-attribute=preferred_username
#flyway
spring.flyway.baseline-on-migrate=true
spring.flyway.baseline-version=0
#ehcache, second level cache
spring.cache.jcache.config=classpath:ehcache.xml
我得到的错误是:
Caused by: org.springframework.web.client.ResourceAccessException: I/O error on GET request for "http://keycloak-prod:8989/realms/remind-me/protocol/openid-connect/certs": Connection refused
我可以通过本地主机上的浏览器连接到 Keycloak。我还通过邮递员连接到它并获取令牌。然而docker中的spring boot应用程序抛出错误。
谢谢!
尝试使用容器的静态IP,我遇到了类似的问题,这是由于执行上下文造成的,因为容器可能位于网络之外,你必须直接指向它,至少对于开发来说,在Windows中你可以使用“ ipconfig”查看虚拟机的ip