0

我想使用 Spring Boot 创建 Web 服务,将其添加到 docker 映像,连接到云 sql,然后在 Compute Engine 上运行。

我正在使用 docker compose 来组合项目的图像和云 sql 代理图像。但是,无论我给它什么 jdbc URL 都无法连接。现在,我正在本地尝试所有这些

我试过以下网址:

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}

码头工人-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:

应用程序属性:

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=/**
4

1 回答 1

2

目前,您在边车模式中使用 Cloud SQL 代理,该模式正在安装一个/cloudsql/<INSTANCE_CONNECTION_NAME>可用于连接到您的 Cloud SQL 实例的 unix 套接字。不幸的是,大多数 Java JDBC 驱动程序不支持 unix 套接字。您可以切换 Cloud SQL 代理以提供 tcp 套接字,而不是使用类似以下内容:"-instances=<INSTANCE_CONNECTION_NAME>=tcp:3306".

或者,您可以使用Cloud SQL JDBC Socket Factory。这是一个 Java 库,可让您创建与 Cloud SQL 实例的经过身份验证的连接,但不需要使用代理。

于 2019-09-16T21:16:58.800 回答