使用 MySQL 时在云 运行 上部署时缺少 unix 套接字
missing unix socket on Cloud Run deploy when using MySQL
我在苏黎世地区遇到了 Cloud 运行 的奇怪问题。
我已将我的应用程序从 Cloud Build 部署为:
"--region",
"europe-west6",
"--platform",
"managed",
"--allow-unauthenticated",
"--add-cloudsql-instances",
"$PROJECT_ID:europe-west6:mysql",
我看到 YAML 并在界面中正确设置。
我希望 /cloudsql/project:europe-west6:mysql
unix 套接字路径存在并被创建,但实际上该文件夹是空的。
当我列出根目录中的文件时 /
我看到 cloudsql
文件夹正在设置
Array
(
[0] => .
[1] => ..
[2] => bin
[3] => boot
[4] => cloudsql
[5] => dev
[6] => etc
[7] => home
[8] => lib
[9] => lib64
[10] => media
[11] => mnt
[12] => opt
[13] => proc
[14] => root
[15] => run
[16] => sbin
[17] => srv
[18] => sys
[19] => tmp
[20] => usr
[21] => var
)
但是在我列出 /cloudsql
中的文件后,文件夹是空的。
Array
(
[0] => .
[1] => ..
)
Current script owner: root
我也打印了这个
所以显然我不明白为什么要创建文件夹,但 unix 套接字不是由云构建的 运行。我尝试使用界面删除 SQL 连接,然后 /cloudsql
文件夹消失了,如果我把它从 UI
或 gcloud run deploy
中放回 /cloudsql
文件夹可见,但其下没有文件。
我在root用户下,权限应该都设置好了。有什么问题吗?
一系列错误在我们这边,云运行服务运行很好。
1。
可能导致此问题的几个问题:
- public 必须在云上设置 IP SQL
- 容器MySQL客户端应支持MySQL版本。我们遇到了 MySQL 8 不受支持的问题。
报告的错误是:Server sent charset (255) unknown to the client.
现在在套接字文件上。这不是常规文件。
某些编程语言和某些库实现会检查此文件是否存在。
他们可以检查错误的功能!!!例如在 PHP 中,scandir
不列出套接字文件,只列出常规目录和文件。这个我今天才知道,让我早点报错。
同样在 PHP is_file
returns 中对于 socket
类型的文件也是错误的。正确的检查方法是 file_exists
.
3。
最重要的是,Linux 发行版可能不会列出套接字文件,我试过这样做:
$ find / -type s
Array
(
[0] => /dev/log
)
如你所见,没有列出任何带有 /cloudsql/*
的东西 如果我有 运行 lsof -i
我不知道为什么没有列出 /cloudsql 文件。也许你可以解释一下。
4.
当你得到:(HY000/2002): No such file or directory
可能是您的默认 MySQL 客户端设置,例如 PHP 它在 php.ini 中有 /tmp/mysql.sock
并且它正在从那里读取。
需要仔细检查如何覆盖 unix_socket
连接字符串。
常见的错误是人们使用 unix_socket:/cloudsql/socket
和双冒号 <- 这是错误的
可接受的定义连接字符串的方法是 unix_socket=/cloudsql/socket
- 您的脚本 运行 太早导致
/cloudsql
路径设置不正确可能还有另一个原因。我无法测试这个。
我在苏黎世地区遇到了 Cloud 运行 的奇怪问题。
我已将我的应用程序从 Cloud Build 部署为:
"--region",
"europe-west6",
"--platform",
"managed",
"--allow-unauthenticated",
"--add-cloudsql-instances",
"$PROJECT_ID:europe-west6:mysql",
我看到 YAML 并在界面中正确设置。
我希望 /cloudsql/project:europe-west6:mysql
unix 套接字路径存在并被创建,但实际上该文件夹是空的。
当我列出根目录中的文件时 /
我看到 cloudsql
文件夹正在设置
Array
(
[0] => .
[1] => ..
[2] => bin
[3] => boot
[4] => cloudsql
[5] => dev
[6] => etc
[7] => home
[8] => lib
[9] => lib64
[10] => media
[11] => mnt
[12] => opt
[13] => proc
[14] => root
[15] => run
[16] => sbin
[17] => srv
[18] => sys
[19] => tmp
[20] => usr
[21] => var
)
但是在我列出 /cloudsql
中的文件后,文件夹是空的。
Array
(
[0] => .
[1] => ..
)
Current script owner: root
我也打印了这个
所以显然我不明白为什么要创建文件夹,但 unix 套接字不是由云构建的 运行。我尝试使用界面删除 SQL 连接,然后 /cloudsql
文件夹消失了,如果我把它从 UI
或 gcloud run deploy
中放回 /cloudsql
文件夹可见,但其下没有文件。
我在root用户下,权限应该都设置好了。有什么问题吗?
一系列错误在我们这边,云运行服务运行很好。
1。 可能导致此问题的几个问题:
- public 必须在云上设置 IP SQL
- 容器MySQL客户端应支持MySQL版本。我们遇到了 MySQL 8 不受支持的问题。
报告的错误是:Server sent charset (255) unknown to the client.
现在在套接字文件上。这不是常规文件。
某些编程语言和某些库实现会检查此文件是否存在。
他们可以检查错误的功能!!!例如在 PHP 中,scandir
不列出套接字文件,只列出常规目录和文件。这个我今天才知道,让我早点报错。
同样在 PHP is_file
returns 中对于 socket
类型的文件也是错误的。正确的检查方法是 file_exists
.
3。 最重要的是,Linux 发行版可能不会列出套接字文件,我试过这样做:
$ find / -type s
Array
(
[0] => /dev/log
)
如你所见,没有列出任何带有 /cloudsql/*
的东西 如果我有 运行 lsof -i
我不知道为什么没有列出 /cloudsql 文件。也许你可以解释一下。
4.
当你得到:(HY000/2002): No such file or directory
可能是您的默认 MySQL 客户端设置,例如 PHP 它在 php.ini 中有 /tmp/mysql.sock
并且它正在从那里读取。
需要仔细检查如何覆盖 unix_socket
连接字符串。
常见的错误是人们使用 unix_socket:/cloudsql/socket
和双冒号 <- 这是错误的
可接受的定义连接字符串的方法是 unix_socket=/cloudsql/socket
- 您的脚本 运行 太早导致
/cloudsql
路径设置不正确可能还有另一个原因。我无法测试这个。