Docker:在已停止的容器中编辑“my.cnf”文件

4

我对“my.cnf”进行了编辑后,在Mac上尝试启动容器时,Kitematic出现错误:

mysqld: [ERROR] Found option without preceding group in config file /etc/mysql/my.cnf at line 19! mysqld: 
        [ERROR] Fatal error in defaults handling. Program aborted!

我已经尝试通过以下方式访问容器:

docker exec -it [container] bash

...但是我遇到了错误:

Error response from daemon: Container [container] is not running

我能够通过图像访问某些内容,但文件似乎不同,所以我不确定发生了什么(我对Docker不是很熟悉)。

在这个阶段,要么进行适当的编辑和修复容器,要么以某种方式将MySQL数据克隆到另一个容器中都是理想的。


1
计划一下,当你需要删除并重新创建容器以进行重要的MySQL安全修复时,你需要做什么。(在容器中编辑文件会在这样做时丢失。) - David Maze
我不会使用Docker,这是确定的。 - Wayne Smallman
2个回答

19

要修复my.cnf,您可以使用docker container cp。它适用于已停止的容器。

  1. 将文件从容器复制到当前路径
docker container cp containerId:/etc/mysql/my.cnf container-my.cnf
  1. 接下来编辑container-my.cnf文件,并将其从路径复制回容器中:
docker container cp container-my.cnf containerId:/etc/mysql/my.cnf

使用现有的MySQL数据与新容器一起:

docker container inspect -f '{{.Mounts}}' [container]

返回卷名(键 volume)以查找数据所在位置。然后启动一个新的mysql容器并将该卷挂载到/var/lib/mysql下:

docker container run -d -v [volume_name]:/var/lib/mysql [image]

之后您可以删除旧容器(实际上在创建新容器之前也可以删除)


2
当我在Windows 10中尝试这个操作时,我会得到一个符号链接,但它并没有链接到任何东西。 - mal
无法工作,它显示“客户端没有所需的特权”。 - Lezir Opav

1
如果您正在使用来自官方的mysql docker镜像,请注意:

https://hub.docker.com/_/mysql

你可以使用自定义的MySQL配置文件来覆盖my.cnf。
如果/my/custom/config-file.cnf是你的自定义配置文件的路径和名称,你可以像这样启动mysql容器(注意,此命令中仅使用自定义配置文件的目录路径):
$ docker run --name some-mysql -v /my/custom:/etc/mysql/conf.d -e  MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

这将启动一个名为“some-mysql”的新容器,其中MySQL实例使用来自/etc/mysql/my.cnf和/etc/mysql/conf.d/config-file.cnf的组合启动设置,以后者的设置为优先。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接