使用 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 文件夹消失了,如果我把它从 UIgcloud 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

  1. 您的脚本 运行 太早导致 /cloudsql 路径设置不正确可能还有另一个原因。我无法测试这个。