当出现 MySQL 容器永远进入正在重新启动状态的问题时,应对措施是什么?

生態的背景

    • PHP: 8.0.28

 

    • Laravel: 9.52.5

 

    MySQL: 8.0.32

出现了

$ docker compose ps
NAME           IMAGE      COMMAND                  SERVICE             CREATED             STATUS                         PORTS
db-server      mysql      "docker-entrypoint.s…"   mysql               7 minutes ago       Restarting (1) 3 seconds ago

出现了一个问题,状态始终处于“重新启动”状态,并且每60秒就会持续重新启动。

$ docker compose logs mysql
...
db-server  | 2023-03-30 18:42:37+09:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
db-server  | 2023-03-30 18:42:37+09:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.32-1.el8 started.
db-server  | 2023-03-30 18:42:38+09:00 [Note] [Entrypoint]: Initializing database files
...

謎般地,↑的日誌持續地永遠展示著。

$ php artisan migrate

   Illuminate\Database\QueryException

  SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name or service not known (SQL: select * from information_schema.tables where table_schema = xxxxxx and table_name = migrations and table_type = 'BASE TABLE')

  at vendor/laravel/framework/src/Illuminate/Database/Connection.php:760
    756▕         // If an exception occurs when attempting to run a query, we'll format the error
    757▕         // message to include the bindings with SQL, which will make this exception a
    758▕         // lot more helpful to the developer instead of just the database's errors.
    759▕         catch (Exception $e) {
  ➜ 760▕             throw new QueryException(
    761▕                 $query, $this->prepareBindings($bindings), $e
    762▕             );
    763▕         }
    764▕     }

      +39 vendor frames
  40  artisan:37
      Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))

试着迁移时出现了找不到主机的错误。(因为MySQL容器未运行当然会出现这种情况)

嘗試過了但並未改善

使用Docker Compose停止并重新创建容器
使用Docker Compose停止并清除卷
重新启动Docker桌面
重新启动Mac电脑

重新构建Docker镜像

$ docker compose build --no-cache

 => [internal] load build context                                                                                                                      0.0s
 => => transferring context: 69B                                                                                                                       0.0s
 => ERROR [stage-0 2/8] RUN apt-get update     && apt install -y lsb-release ca-certificates apt-transport-https software-properties-common bash-comp  0.6s
------
 > [stage-0 2/8] RUN apt-get update     && apt install -y lsb-release ca-certificates apt-transport-https software-properties-common bash-completion     && apt-get install -y git unzip libzip-dev libicu-dev libonig-dev libfreetype6-dev libjpeg62-turbo-dev libpng-dev libjpeg-dev vim lsof     && docker-php-ext-install intl pdo_mysql zip bcmath:
#0 0.395 Get:1 http://deb.debian.org/debian bullseye InRelease [116 kB]
#0 0.462 Get:2 http://deb.debian.org/debian-security bullseye-security InRelease [48.4 kB]
#0 0.495 Err:1 http://deb.debian.org/debian bullseye InRelease
#0 0.495   At least one invalid signature was encountered.
#0 0.515 Get:3 http://deb.debian.org/debian bullseye-updates InRelease [44.1 kB]
#0 0.543 Err:2 http://deb.debian.org/debian-security bullseye-security InRelease
#0 0.543   At least one invalid signature was encountered.
#0 0.586 Err:3 http://deb.debian.org/debian bullseye-updates InRelease
#0 0.586   At least one invalid signature was encountered.
#0 0.591 Reading package lists...
#0 0.599 W: GPG error: http://deb.debian.org/debian bullseye InRelease: At least one invalid signature was encountered.
#0 0.599 E: The repository 'http://deb.debian.org/debian bullseye InRelease' is not signed.
#0 0.599 W: GPG error: http://deb.debian.org/debian-security bullseye-security InRelease: At least one invalid signature was encountered.
#0 0.599 E: The repository 'http://deb.debian.org/debian-security bullseye-security InRelease' is not signed.
#0 0.599 W: GPG error: http://deb.debian.org/debian bullseye-updates InRelease: At least one invalid signature was encountered.
#0 0.599 E: The repository 'http://deb.debian.org/debian bullseye-updates InRelease' is not signed.
------
failed to solve: executor failed running [/bin/sh -c apt-get update     && apt install -y lsb-release ca-certificates apt-transport-https software-properties-common bash-completion     && apt-get install -y git unzip libzip-dev libicu-dev libonig-dev libfreetype6-dev libjpeg62-turbo-dev libpng-dev libjpeg-dev vim lsof     && docker-php-ext-install intl pdo_mysql zip bcmath]: exit code: 100

apt-get update出问题真的太奇怪了。

我找到了一篇文章,据说如果磁盘容量满了就会出错。
链接:https://note.yu9824.com/error/2022/03/19/docker-debian-gpg-error.html

虽然没有特别的压力,但是尝试一下似乎是值得的。

解决

$ docker system prune --all
$ docker compose up -d

虽然只有大约5GB的容量,但我还是先整理了一下。

$ docker compose ps

NAME                IMAGE      COMMAND                  SERVICE             CREATED            STATUS             PORTS
db-server           mysql      "docker-entrypoint.s…"   mysql               1 minutes ago      Up 1 minutes       0.0.0.0:3306->3306/tcp, 33060/tcp

MySQL容器已经成功启动了。

$ docker compose logs mysql
db-server  | 2023-03-30 19:02:56+09:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.32-1.el8 started.
db-server  | 2023-03-30 19:02:56+09:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
db-server  | 2023-03-30 19:02:57+09:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.32-1.el8 started.
db-server  | 2023-03-30 19:02:57+09:00 [Note] [Entrypoint]: Initializing database files
db-server  | 2023-03-30 19:03:02+09:00 [Note] [Entrypoint]: Database files initialized
db-server  | 2023-03-30 19:03:02+09:00 [Note] [Entrypoint]: Starting temporary server
db-server  | 2023-03-30 19:03:03+09:00 [Note] [Entrypoint]: Temporary server started.
db-server  | '/var/lib/mysql/mysql.sock' -> '/var/run/mysqld/mysqld.sock'
db-server  | Warning: Unable to load '/usr/share/zoneinfo/iso3166.tab' as time zone. Skipping it.
db-server  | Warning: Unable to load '/usr/share/zoneinfo/leap-seconds.list' as time zone. Skipping it.
db-server  | Warning: Unable to load '/usr/share/zoneinfo/leapseconds' as time zone. Skipping it.
db-server  | Warning: Unable to load '/usr/share/zoneinfo/tzdata.zi' as time zone. Skipping it.
db-server  | Warning: Unable to load '/usr/share/zoneinfo/zone.tab' as time zone. Skipping it.
db-server  | Warning: Unable to load '/usr/share/zoneinfo/zone1970.tab' as time zone. Skipping it.
db-server  | 2023-03-30 19:03:06+09:00 [Note] [Entrypoint]: Creating database xxxxxx
db-server  | 2023-03-30 19:03:06+09:00 [Note] [Entrypoint]: Creating user user
db-server  | 2023-03-30 19:03:06+09:00 [Note] [Entrypoint]: Giving user user access to schema xxxxx
db-server  |
db-server  | 2023-03-30 19:03:06+09:00 [Note] [Entrypoint]: Stopping temporary server
db-server  | 2023-03-30 19:03:08+09:00 [Note] [Entrypoint]: Temporary server stopped
db-server  |
db-server  | 2023-03-30 19:03:08+09:00 [Note] [Entrypoint]: MySQL init process done. Ready for start up.
db-server  |

MySQL似乎已经成功启动了。
真是令人高兴,值得庆祝。