docker-compose重新启动Mysql报错changing ownership of ‘/var/lib/mysql/mysql.sock‘: No such file or direct

这篇具有很好参考价值的文章主要介绍了docker-compose重新启动Mysql报错changing ownership of ‘/var/lib/mysql/mysql.sock‘: No such file or direct。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、背景

最近在使用 docker-compose 编排整合一个项目(springboot+mysql)的时候,首次启动后重新再启动的时候,mysql 容器启动失败,通过 docker logs 命令查看 mysql 容器的启动日志如下:

chown: changing ownership of '/var/lib/mysql/mysql.sock': No such file or directory

docker-compose.yml 文件完整内容如下:

version: '3'
services:
  mysql:
    image: mysql:5.7
    restart: always
    container_name: mysql
    #使用该参数,container内的root拥有真正的root权限,否则,container内的root只是外部的一个普通用户权限
    #设置为true,不然数据卷可能挂载不了,启动不起
    privileged: true
    environment:
      MYSQL_ROOT_PASSWORD: mysql123321
      TZ: Asia/Shanghai
    ports:
      - 3306:3306
    volumes:
      - /Users/cab5/docker_compose/bas/mysql/data:/var/lib/mysql
      - /Users/cab5/docker_compose/bas/mysql/config/my.cnf:/etc/mysql/my.cnf
      - /Users/cab5/docker_compose/bas/mysql/init:/docker-entrypoint-initdb.d/
      - /Users/cab5/docker_compose/bas/mysql/sql:/opt/sql
    command:
      --max_connections=1000
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --default-authentication-plugin=mysql_native_password
  a1-api:
    image: a1-api:latest
    restart: always
    container_name: a1
    ports:
      - 8080:8080
    depends_on:
      - mysql
    links:
      - mysql

my.cnf 文件完整内容如下:

[mysqld]
user=mysql
default-storage-engine=INNODB
character-set-server=utf8
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8

二、问题分析

从报错信息上来看,应该是 mysql 启动的时候要去 /var/lib/mysql 路径找 mysql.sock 文件,但是该路径下没有这个文件,所以导致报错。

这里有一个问题是:为什么首次启动的时候没有报错,重启才出现的这个问题呢?

首先,mysql 首次启动的时候,默认情况下会在容器内的 /var/lib/mysql 路径下生成一些文件,如下:

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
e6946816696d        a1-api:latest       "java -Djava.securit…"   24 hours ago        Up 24 hours         0.0.0.0:8080->8080/tcp              a1
edc4e7ef57df        mysql:5.7           "docker-entrypoint.s…"   24 hours ago        Up 24 hours         0.0.0.0:3306->3306/tcp, 33060/tcp   mysql
bogon:config eric$ docker exec -it edc4e7ef57df /bin/bash
bash-4.2# cd /var/lib/mysql
bash-4.2# ls -l
total 181288
-rw-r-----   1 root root       56 Jan 29 11:09 auto.cnf
drwxr-x---   5 root root      160 Jan 29 11:09 bas_database
-rw-------   1 root root     1676 Jan 29 11:09 ca-key.pem
-rw-r--r--   1 root root     1112 Jan 29 11:09 ca.pem
-rw-r--r--   1 root root     1112 Jan 29 11:09 client-cert.pem
-rw-------   1 root root     1680 Jan 29 11:09 client-key.pem
-rw-r-----   1 root root     1301 Jan 29 11:09 ib_buffer_pool
-rw-r-----   1 root root 50331648 Jan 29 11:10 ib_logfile0
-rw-r-----   1 root root 50331648 Jan 29 11:09 ib_logfile1
-rw-r-----   1 root root 79691776 Jan 29 11:10 ibdata1
drwxr-x---  77 root root     2464 Jan 29 11:09 mysql
lrwxrwxrwx   1 root root       27 Jan 29 11:09 mysql.sock -> /var/run/mysqld/mysqld.sock
drwxr-x---  91 root root     2912 Jan 29 11:09 performance_schema
-rw-------   1 root root     1680 Jan 29 11:09 private_key.pem
-rw-r--r--   1 root root      452 Jan 29 11:09 public_key.pem
-rw-r--r--   1 root root     1112 Jan 29 11:09 server-cert.pem
-rw-------   1 root root     1676 Jan 29 11:09 server-key.pem
drwxr-x--- 108 root root     3456 Jan 29 11:09 sys

从上边的文件列表中,我们可以看到 mysql.sock 这个文件(重启的时候就是因为找不到这个问题件才会报错的),目前来看容器内是有这个文件。

又从 docker-compose.yml 文件中,我们可以看到该目录(/var/lib/mysql)被挂载到了本地的 /Users/cab5/docker_compose/bas/mysql/data 目录下,让我们来看本地目录下的文件,如下:

bogon:data cab5$ ls -l
total 387152
-rw-r-----    1 eric  staff        56  1 29 11:09 auto.cnf
drwxr-x---    5 eric  staff       160  1 29 11:09 bas_database
-rw-------    1 eric  staff      1676  1 29 11:09 ca-key.pem
-rw-r--r--    1 eric  staff      1112  1 29 11:09 ca.pem
-rw-r--r--    1 eric  staff      1112  1 29 11:09 client-cert.pem
-rw-------    1 eric  staff      1680  1 29 11:09 client-key.pem
-rw-r-----    1 eric  staff      1301  1 29 11:09 ib_buffer_pool
-rw-r-----    1 eric  staff  50331648  1 29 11:10 ib_logfile0
-rw-r-----    1 eric  staff  50331648  1 29 11:09 ib_logfile1
-rw-r-----    1 eric  staff  79691776  1 29 11:10 ibdata1
-rw-r-----    1 eric  staff  12582912  1 29 11:10 ibtmp1
drwxr-x---   77 eric  staff      2464  1 29 11:09 mysql
lrwxrwxrwx    1 eric  staff        27  1 29 11:09 mysql.sock -> /var/run/mysqld/mysqld.sock
drwxr-x---   91 eric  staff      2912  1 29 11:09 performance_schema
-rw-------    1 eric  staff      1680  1 29 11:09 private_key.pem
-rw-r--r--    1 eric  staff       452  1 29 11:09 public_key.pem
-rw-r--r--    1 eric  staff      1112  1 29 11:09 server-cert.pem
-rw-------    1 eric  staff      1676  1 29 11:09 server-key.pem
drwxr-x---  108 eric  staff      3456  1 29 11:09 sys

在本地的 /Users/cab5/docker_compose/bas/mysql/data 目录下,我们也找到了 mysql.sock 文件。

按着这个道理来说,mysql重启的时候从挂载的目录( /Users/cab5/docker_compose/bas/mysql/data)下应该能找到 mysql.sock 文件啊?为什么会报 No such file or directory 这个错呢?

让我们回头再仔细看下容器内的 mysql.sock 文件。原来,Ta 后边还有一个软链接 /var/run/mysqld/mysqld.sock!

mysql 容器首次启动的时候,在生成 /var/lib/mysql/mysql.sock 文件的同时还会生成一个对应的软连接 /var/run/mysqld/mysqld.sock。

我们再看下与容器内 /var/lib/mysql 目录挂载的本地目录(/Users/cab5/docker_compose/bas/mysql/data)中的 mysql.sock 文件,后边也有一个软链接(也就是说挂载会把软链接一并带到本地)。

但是,软链接的文件(/var/run/mysqld/mysqld.sock)在本地真的存在吗?

让我们通过 cd 命令来看看 /var/run/mysqld/mysqld.sock 文件是否存在于本地,如下:

bogon:data cab5$ cd /var/run/mysqld/
-bash: cd: /var/run/mysqld/: No such file or directory

这里得出一个结论:挂载虽然把容器内的软链接带到了本地,却并没有在本地生成真的文件。

同时造成问题出现的原因也就明了了:

mysql 容器重启的时候会在容器内的 /var/lib/mysql 目录下找 mysql.sock 文件,由于该目录实际是挂载到了本地的 /Users/cab5/docker_compose/bas/mysql/data 目录下。所以,实际上就是去 /Users/cab5/docker_compose/bas/mysql/data 目录下找 mysql.sock 文件 ,又由于该目录下的 mysql.sock 文件实际是个软链接( /var/run/mysqld/mysqld.sock),且该软链接指向的文件在本地根本不存在,所以导致 mysql 重启的时候报错!

三、解决办法

这里提供一个简单粗暴的方案来解决这个问题,就是直接去掉软链接

方法是我们通过修改 my.cnf 文件来重新指定 mysql.sock 文件的生成路径,如下:文章来源地址https://www.toymoban.com/news/detail-558500.html

[mysqld]
user=mysql
default-storage-engine=INNODB
character-set-server=utf8
pid-file=/var/lib/mysql/mysql.pid
# 将 socket 的默认地址(/var/run/mysqld/mysqld.sock)改为 /var/lib/mysql/mysql.sock
socket=/var/lib/mysql/mysql.sock
datadir=/var/lib/mysql
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8

到了这里,关于docker-compose重新启动Mysql报错changing ownership of ‘/var/lib/mysql/mysql.sock‘: No such file or direct的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • docker-compose启动minio

    一、创建文件夹 二、docker-compose.yml 注意:新版 :RELEASE.2023-03-24T21-41-23Z 数据格式是这种 老版: RELEASE.2022-05-26T05-48-41Z 三、开启防火墙 四、验证 172.50.2.40:9001

    2024年02月16日
    浏览(44)
  • Docker-compose 启动 lnmp 开发环境

    GitHub传送阵 docker-lnmp 项目帮助开发者快速构建本地开发环境,包括Nginx、PHP、MySQL、Redis 服务镜像,支持配置文件和日志文件映射,不限操作系统; 此项目适合个人开发者本机部署,可以快速切换服务版本满足学习服务新版本的需求; 也适合团队中统一开发环境,设定好配置

    2024年02月01日
    浏览(46)
  • docker-compose 如何安排容器启动的顺序

    在使用docker-compose进行容器部署的时候,时常是需要对容器的启动顺序进行编排,比如在应用容器启动前,需要先启动数据库的容器。通过对官方文档的阅读,发现在docker-compose中,可以使用depends_on配合健康检查healthcheck来实现。 参考链接: https://docs.docker.com/compose/compose-fi

    2024年02月12日
    浏览(49)
  • docker-compose.yml报错问题

    ERROR: The Compose file \\\'./docker-compose.yml\\\' is invalid because: Invalid top-level property \\\"True\\\". Valid top-level sections for this Compose file are: version, services, networks, volumes, secrets, configs, and extensions starting with \\\"x-\\\". You might be seeing this error because you\\\'re using the wrong Compose file version. Either specify a supported vers

    2024年02月14日
    浏览(49)
  • docker-compose一键启动neo4j

    下载镜像 docker pull neo4j:3.5.22-community 编写配置文件 参考文档 编写docker-compose.yml文件 一键启动 docker-compose up -d

    2024年02月03日
    浏览(51)
  • 【QA】docker-compose-部署django-如何设置自动启动

    使用docker-compose部署django项目,通常做法是: 构建docker镜像 运行容器 进入容器里面启动django项目 但是这样不够自动化。 尝试通过配置脚本的方式,让容器启动的时候就启动django项目,但这样往往使得容器一直处于重启状态,容器无法运行,本文主要解决这个问题 docker-com

    2024年01月23日
    浏览(41)
  • 使用docker/docker-compose通过自定义的redis.conf文件启动redis 7.2.3,附上docker-compose.yml的redis配置

    目录 一.复制以及使用自定义的redis.conf文件 1.在官网拷贝对应版本的配置文件内容新建redis.conf文件进行粘贴。(推荐) 2.也可以去官网下载对应版本的redis的tar.gz包,解压后在根目录下找到redis.conf文件复制也可也可。 二.配置redis.conf文件(这里有个小坑) 1.注释掉bind 127.0.0.1

    2024年02月03日
    浏览(59)
  • 【Docker】解决docker-compose启动的容器一直处于restarting状态的问题

    通过如下的文件启动容器后 status一直处于Restarting 且执行如下命令报错: 改成如下后解决 参考:https://stackoverflow.com/a/63990209

    2024年02月11日
    浏览(44)
  • Elasticsearch:使用 Docker-Compose 启动单节点 Elastic Stack

    首先必须指出的是,在我之前的文章 “Elasticsearch:使用 Docker compose 来一键部署 Elastic Stack 8.x”,我有详述根据官方文档如何创建一个带有三个节点的安全 Elasticsearch 集群。本文基于著名的 Deviatony 存储库和 Elastic 的官方说明。 建议先通读这些说明,如果你已经可以根据这些

    2024年02月05日
    浏览(65)
  • docker-compose部署mysql

    docker-compose 虽然docker部署环境比自己下载安装包要方便不少,但是docker的命令还有挂载目录在每次启动容器的时候都去找命令对使用者是很不友好的,而且有时候要启动多个容器的时候显然一个个的启动是很麻烦的。所以如果可以事先将\\\"启动脚本\\\"写好的话,之后就算虚拟机

    2024年02月02日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包