Docker 映像 Spring 引导无法连接到 CloudSQL
Docker image with Spring boot fails to connect to CloudSQL
我想使用 Spring 引导创建 Web 服务,将其添加到 docker 映像,连接到云 sql,然后在 Compute Engine 上 运行。
我正在使用 docker compose 来组合项目图像和云 sql 代理图像。但是,无论我给jdbcURL什么,都连接不上。现在,我正在本地尝试所有这些
我试过以下 URLs:
1. spring.datasource.url=jdbc:mysql:///cloudsql/myinstancename/${MYSQL_DATABASE}
2. spring.datasource.url=jdbc:mysql://cloudsql/myinstancename/${MYSQL_DATABASE}
3. spring.datasource.url=jdbc:mysql://127.0.0.1:3306/${MYSQL_DATABASE}
docker-compose.yml
version: '3'
services:
app:
image: appname
volumes:
- cloudsql:/cloudsql
depends_on:
- sql_proxy
ports:
- 8080:8080
# SQL proxy is built correctly, says
# Listening on /cloudsql/myinstancename for myinstancename
# sql_proxy_1 | Ready for new connections
sql_proxy:
environment:
- MYSQL_ROOT_PASSWORD=password!#
- MYSQL_DATABASE=appname
- MYSQL_USER=root
image: gcr.io/cloudsql-docker/gce-proxy:1.12
command:
/cloud_sql_proxy
-dir=/cloudsql
-instances=myinstancename # (I have added this correctly)
-credential_file=/root/keys/keyfile.json
volumes:
- E:\mykey.json:/root/keys/keyfile.json:ro
- cloudsql:/cloudsql
ports:
- 3306:3306
volumes:
# This empty property initializes a named volume.
cloudsql:
application.properties:
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.hibernate.ddl-auto=update
spring.datasource.url=jdbc:mysql:///cloudsql/myinstancename/${MYSQL_DATABASE}
spring.datasource.username=${MYSQL_USER}
spring.datasource.password=${MYSQL_ROOT_PASSWORD}
spring.security.enabled=false
security.ignored=/**
目前,您正在使用 sidecar 模式中的 Cloud SQL 代理,该模式正在 /cloudsql/<INSTANCE_CONNECTION_NAME>
中安装一个 unix 套接字,可用于连接到您的 Cloud SQL 实例。不幸的是,大多数 Java JDBC 驱动程序不支持 unix 套接字。您可以将云 SQL 代理切换为提供 tcp 套接字,而不是像下面这样:"-instances=<INSTANCE_CONNECTION_NAME>=tcp:3306"
.
或者,您可以使用 Cloud SQL JDBC Socket Factory。这是一个 Java 库,允许您创建到云 SQL 实例的经过身份验证的连接,但不需要使用代理。
我想使用 Spring 引导创建 Web 服务,将其添加到 docker 映像,连接到云 sql,然后在 Compute Engine 上 运行。
我正在使用 docker compose 来组合项目图像和云 sql 代理图像。但是,无论我给jdbcURL什么,都连接不上。现在,我正在本地尝试所有这些
我试过以下 URLs:
1. spring.datasource.url=jdbc:mysql:///cloudsql/myinstancename/${MYSQL_DATABASE}
2. spring.datasource.url=jdbc:mysql://cloudsql/myinstancename/${MYSQL_DATABASE}
3. spring.datasource.url=jdbc:mysql://127.0.0.1:3306/${MYSQL_DATABASE}
docker-compose.yml
version: '3'
services:
app:
image: appname
volumes:
- cloudsql:/cloudsql
depends_on:
- sql_proxy
ports:
- 8080:8080
# SQL proxy is built correctly, says
# Listening on /cloudsql/myinstancename for myinstancename
# sql_proxy_1 | Ready for new connections
sql_proxy:
environment:
- MYSQL_ROOT_PASSWORD=password!#
- MYSQL_DATABASE=appname
- MYSQL_USER=root
image: gcr.io/cloudsql-docker/gce-proxy:1.12
command:
/cloud_sql_proxy
-dir=/cloudsql
-instances=myinstancename # (I have added this correctly)
-credential_file=/root/keys/keyfile.json
volumes:
- E:\mykey.json:/root/keys/keyfile.json:ro
- cloudsql:/cloudsql
ports:
- 3306:3306
volumes:
# This empty property initializes a named volume.
cloudsql:
application.properties:
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.hibernate.ddl-auto=update
spring.datasource.url=jdbc:mysql:///cloudsql/myinstancename/${MYSQL_DATABASE}
spring.datasource.username=${MYSQL_USER}
spring.datasource.password=${MYSQL_ROOT_PASSWORD}
spring.security.enabled=false
security.ignored=/**
目前,您正在使用 sidecar 模式中的 Cloud SQL 代理,该模式正在 /cloudsql/<INSTANCE_CONNECTION_NAME>
中安装一个 unix 套接字,可用于连接到您的 Cloud SQL 实例。不幸的是,大多数 Java JDBC 驱动程序不支持 unix 套接字。您可以将云 SQL 代理切换为提供 tcp 套接字,而不是像下面这样:"-instances=<INSTANCE_CONNECTION_NAME>=tcp:3306"
.
或者,您可以使用 Cloud SQL JDBC Socket Factory。这是一个 Java 库,允许您创建到云 SQL 实例的经过身份验证的连接,但不需要使用代理。