linux启动docker镜像成功,而win启动该镜像mysql报错

文章讲述了在Docker中使用自定义PHP镜像安装MySQL时,因Linux和Windows操作系统对lower_case_table_names设置的不同导致的错误。解决方案包括在MySQL初始化的系统上部署,或在Win上启动前修改环境变量,或使用docker-compose新建容器独立设置环境变量。
  • dockers报错:Starting MySQL database server mysqld ...failed
  • 进入容器内部,查看mysql错误日志:cat /var/log/mysql/error.log
  • mysql具体报错: Different lower_case_table_names settings for server ('2') and data dictionary ('0').

出现该问题的重要前提是:

  • docker启动mysql并不是根据官方mysql镜像,而是在一个基础php镜像上安装的mysql服务。
  • 我的mysql数据通过docker的卷挂载在外部,通过一个mysql文件夹管理。

当我把linux上可以运行的镜像和mysql外部卷都发送给win机器运行,由于mysql数据是外部挂载的,所以会出现同一个镜像,换了操作系统却无法运行的问题。本质上是mysql在linux和win上的环境变量lower_case_table_names默认值不同导致的。由于数据库数据在linux上初始化,该值已经为0,而在win上需要为2,所以报错。

Docker镜像确实是操作系统无关的,但是MySQL的lower_case_table_names设置是与操作系统有关的。这是因为lower_case_table_names设置决定了MySQL如何存储和比较表名和数据库名。

在Windows和Mac系统中,文件系统通常不区分大小写,因此MySQL默认将lower_case_table_names设置为2。在这种设置下,MySQL将表名存储为小写,并且比较时不区分大小写。

在Linux系统中,文件系统通常区分大小写,因此MySQL默认将lower_case_table_names设置为0。在这种设置下,MySQL将表名存储为给定的大小写,并且比较时区分大小写。

当你在一个系统(例如Windows)上创建MySQL数据,然后尝试在另一个系统(例如Linux)上使用这些数据时,可能会出现这个错误。这是因为数据字典(存储了表名和数据库名的元数据)的lower_case_table_names设置与服务器的设置不一致。

解决方案

解决个蛋,一般都是放在linux上运行的,mysql在哪初始化就在哪部署。将镜像和外部卷都放在linux机器上部署就好了。win上报错要启动mysql前修改那个环境变量的值。

或者有一种麻烦的思路,就是将其mysql服务从一个容器中剥离出来,新开一个容器启动,这样方便设置环境变量。如果要修改一个非mysql基础镜像的mysql环境变量还是比较繁琐的。新开一个容器,用docker-compose启动即可。

### 如何在 Linux 系统中启动 Docker 容器 为了成功启动 Docker 容器,在 Linux 中通常会使用 `docker run` 命令来运行一个新的容器实例。此命令允许指定各种参数以控制新容器的行为。 #### 使用 docker run 启动容器 基本语法如下: ```bash docker run [OPTIONS] IMAGE [COMMAND] [ARG...] ``` 其中 `[OPTIONS]` 是可选的标志列表,用于定义容器的各种属性;`IMAGE` 表示要使用的镜像名称或者 ID;而 `[COMMAND]` 和 `[ARG...]` 则是用来覆盖默认入口点和 CMD 设置的具体指令及其参数[^2]。 一些常用的选项包括但不限于: - `-d`: 让容器以后台模式运行并打印出该进程的 Container ID。 - `-p HOST_PORT:CONTAINER_PORT`: 将主机端口映射到容器内部的服务监听端口上。 - `-v HOST_DIR:CONTAINER_DIR`: 绑定挂载目录,使得宿主机上的某个路径可以被容器访问。 - `--name NAME`: 为容器赋予一个易于识别的名字而不是随机生成的一个字符串作为名字。 - `--rm`: 当容器退出时自动删除它所占用的空间资源而不留痕迹。 例如,如果想要以前台方式启动一个基于官方 Nginx 镜像的新容器,并将其暴露给外部网络,则应执行这样的命令: ```bash docker run -it --rm nginx ``` 这里 `-it` 参数组合表示交互式终端连接至容器标准输入输出流,`--rm` 意味着一旦停止就会立即清理掉这个临时性的容器实体[^3]。 对于某些特定的应用程序如 MySQL 或者 Redis 数据库服务来说,可能还需要额外设置环境变量或者其他配置项以便更好地适应实际应用场景需求。比如启动带有持久化存储功能的 PostgreSQL 实例可以通过下面的方式实现: ```bash docker run \ -e POSTGRES_USER=myuser \ -e POSTGRES_PASSWORD=mypassword \ -e POSTGRES_DB=mydb \ -v /path/to/local/data:/var/lib/postgresql/data \ postgres:latest ``` 上述例子展示了怎样通过传递环境变量 (`POSTGRES_USER`, `POSTGRES_PASSWORD`, `POSTGRES_DB`) 来初始化数据库以及利用卷(`/path/to/local/data`)来进行数据保存操作[^4]。 #### 开始之前确认 Docker 已经正常工作 确保 Docker 服务已经正确安装并且正在运行是非常重要的一步。这可以通过以下命令完成检查和服务管理: ```bash # 启动docker systemctl start docker # 查看docker状态 systemctl status docker # 如果需要开机自启则启用该项 systemctl enable docker ``` 这些命令可以帮助验证当前系统的 Docker 是否处于活动状态,并且能够按照预期响应用户的请求[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值