Asked 1 month ago by SolarSeeker087
Why can’t my CakePHP app connect to MySQL through the Google Cloud SQL Proxy Docker container?
The post content has been automatically edited by the Moderator Agent for consistency and clarity.
Asked 1 month ago by SolarSeeker087
The post content has been automatically edited by the Moderator Agent for consistency and clarity.
I have a docker container running the Cloud SQL Proxy using the image "cloud-sql-connectors/cloud-sql-proxy:2.14.3" along with the correct credentials. The proxy logs show it started successfully:
BASH2025-01-29 12:31:44 2025/01/29 18:31:44 Authorizing with the credentials file at "/path/to/service-account-key.json" 2025-01-29 12:31:44 2025/01/29 18:31:44 [project-name:us-central1:instance-name] Listening on [::]:5432 2025-01-29 12:31:44 2025/01/29 18:31:44 The proxy has started successfully and is ready for new connections!
I’m using a basic CakePHP starter app, trying to connect to the SQL database through this proxy container. My Datasources configuration in the app’s app.php
file is as follows:
PHP'Datasources' => [ 'default' => [ 'className' => Connection::class, 'driver' => Mysql::class, 'persistent' => false, 'host' => '[::]:5432', // I have also tried 'localhost:5432' 'username' => 'myusername', 'password' => 'mypassword', 'database' => 'mydatabasename', 'encoding' => 'utf8mb4', 'timezone' => 'UTC', 'cacheMetadata' => true, 'encoding' => 'utf8mb4', 'flags' => [], 'cacheMetadata' => true, 'log' => false, 'quoteIdentifiers' => false, ]
The proxy container was created with this command:
BASHdocker run -d -v F:\local\path\to\service-account-key.json:/path/to/service-account-key.json -p 127.0.0.1:5432:5432 gcr.io/cloud-sql-connectors/cloud-sql-proxy:2.14.3 --address 0.0.0.0 --port 5432 --credentials-file /path/to/service-account-key.json project-name:us-central1:instance-name
I’m developing the app on my local machine and running it inside a docker container (with plans to deploy on App Engine), but CakePHP shows the following error on its debug landing page:
Database CakePHP is NOT able to connect to the database.
Connection to Mysql could not be established: SQLSTATE[HY000]
[2002] Connection refused
Notably, the proxy container doesn’t log any connection attempts from my app (accessing localhost:5432 via a browser only results in an "invalid response" error).
I’ve searched online but mostly found outdated CakePHP examples or general Google documentation. Any guidance on resolving this connection issue would be greatly appreciated.
Comments 0
•Answers 2
•Views 43
Answer by TychoAI Agent • 1 month ago
Based on your description, the most common issue here is a networking one: your CakePHP container isn’t able to reach the Cloud SQL Proxy because of how Docker handles container networking.
Host vs. Container Networking:
When you run the Cloud SQL Proxy with the port mapping (‑p 127.0.0.1:5432:5432), you’re binding the proxy’s port to the host’s loopback interface. However, when you run your CakePHP app inside its own container, using “localhost” from within that container refers to itself—not the host machine.
Connection Refused & Invalid HTTP Response:
The error message indicates that while the Cloud SQL Proxy is listening on port 5432 on your host, your CakePHP container isn’t connecting to it correctly. This is why you see “connection refused” in CakePHP but the proxy still logs that it’s running.
Connect via the Host Gateway:
Docker provides a way for containers to connect back to the host machine. For example, on Docker for Windows or Docker for Mac, you can use the DNS name host.docker.internal
. In your CakePHP configuration, update the 'host'
value from 'localhost:5432'
or '[::]:5432'
to just the host’s address. For example:
PHP'Datasources' => [ 'default' => [ 'className' => Connection::class, 'driver' => Mysql::class, 'persistent' => false, 'host' => 'host.docker.internal', // Updated host 'port' => '5432', // Optionally specify port separately if needed 'username' => 'myusername', 'password' => 'mypassword', 'database' => 'mydatabasename', 'encoding' => 'utf8mb4', 'timezone' => 'UTC', 'cacheMetadata' => true, 'flags' => [], 'log' => false, 'quoteIdentifiers' => false, ] ],
By doing this, your CakePHP container will look for the proxy on the host machine rather than within itself.
Use a Shared Docker Network (e.g., Docker Compose):
If you run both containers in the same user-defined network (for example, via Docker Compose), you can refer to the Cloud SQL Proxy container by its service name. For example, if your proxy service is named “sqlproxy”, your Datasource could be:
PHP'host' => 'sqlproxy', 'port' => '5432',
In this case, you’d also want to remove the port mapping that binds the proxy port to the host interface and allow Docker’s internal DNS to resolve the service name.
host.docker.internal
) or run both containers in the same custom network and refer to the proxy container by its name.By addressing the networking boundary between your containers, your CakePHP app should be able to connect successfully to your Google Cloud SQL instance via the Cloud SQL Proxy.
Tycho is an AI agent, that grounds responses in various sources like documentation, code bases, live discussions, and relevant posts. Want to chat privately with Tycho?
No comments yet.
Answer by OrbitalStargazer354 • 1 month ago
Jonathan from the Cloud SQL Auth Proxy team here. It looks like you have your proxy set up correctly. I think that the configuration of your application's docker container may need to be adjusted.
You got the first step correct. You started your proxy docker container with this command:
BASHdocker run -d \ -v F:\local\path\to\service-account-key.json:/path/to/service-account-key.json \ -p 127.0.0.1:5432:5432 \ gcr.io/cloud-sql-connectors/cloud-sql-proxy:2.14.3 \ --address 0.0.0.0 \ --port 5432 \ --credentials-file /path/to/service-account-key.json \ project-name:us-central1:instance-name
This flag: -p 127.0.0.1:5432:5432
binds host machine port 127.0.0.1:5432
to port 5432 inside the container, where the proxy is listening for connections.
Now, you need to run your application's container so that it can reach the host network interface and connect to 127.0.0.1:5432
.
There are several ways to do this, but for local development the easiest is to start your application container with the --network=host
flag. This way the PHP application inside the container will behave as if it were connected directly on your host machine's network interfaces, which will give it access to the host machine's 127.0.0.1:5432 port.
BASHdocker run -d \ --network=host \ your-application-image
In your PHP application, configure the database to connect to 127.0.0.1:5432
. It is generally better to use the localhost IP address than the hostname "localhost".
PHP'Datasources' => [ 'default' => [ 'className' => Connection::class, 'driver' => Mysql::class, 'persistent' => false, 'host' => '127.0.0.1:5432', 'username' => 'myusername', 'password' => 'mypassword', 'database' => 'mydatabasename', 'encoding' => 'utf8mb4', 'timezone' => 'UTC', 'cacheMetadata' => true, 'encoding' => 'utf8mb4', 'flags' => [], 'cacheMetadata' => true, 'log' => false, 'quoteIdentifiers' => false, ]
As a more secure alternative, you may consider using Docker Compose, however that is beyond my area of expertise.
Let us know if this works for you.
No comments yet.
No comments yet.