docker容器中的MySQL服务器不';集装箱交付后,我不能工作

docker容器中的MySQL服务器不';集装箱交付后,我不能工作,mysql,docker,Mysql,Docker,我创建了docker-compose.yml文件,该文件创建了MySQL映像,并将MySQL root用户的密码设置为“hello” 然后我跑: sudo docker-compose up # (1) 。。。从包含此文件的目录中 第一个问题是,新创建的容器开始在前台运行,但不是在bash中运行,我不能将它放在后台而不退出它,这可以通过Ctrl+C来实现,或者通过某种方式进入bash,从这个过程中退出 但当我打开新的终端窗口并运行时: sudo docker exec -it bdebee1b

我创建了docker-compose.yml文件,该文件创建了MySQL映像,并将MySQL root用户的密码设置为“hello”

然后我跑:

sudo docker-compose up # (1)
。。。从包含此文件的目录中

第一个问题是,新创建的容器开始在前台运行,但不是在bash中运行,我不能将它放在后台而不退出它,这可以通过Ctrl+C来实现,或者通过某种方式进入bash,从这个过程中退出

但当我打开新的终端窗口并运行时:

sudo docker exec -it bdebee1b8090 /bin/bash # (2)
…,其中bdebee1b8090是正在运行的容器的id,我输入bash,在这里我可以作为root用户输入MySQL shell,输入密码“hello”:

然后我退出容器中的MySQL shell和bash shell,而不停止容器

然后我将更改提交到容器:

sudo docker commit bdebee1b8090 hello_mysql # (4)
…创建一个图像。然后,当我运行图像时:

sudo docker run -it --rm hello_mysql /bin/bash # (5)
。。。然后尝试以root用户身份再次启动MySQL shell,输入密码“hello”,我会得到如下错误

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

即使在我重新启动MySQL服务器之后:

/etc/init.d/mysql restart # (6)
…我得到了同样的错误

以上所有命令都是在ubuntu上运行的

为什么会这样

编辑:

当我尝试在MacOS High Sierra上执行这些步骤时,我被卡在步骤(3)上,因为当我尝试输入密码“hello”时,它不会被接受。此错误显示在屏幕上:

ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

当我尝试在容器中重新启动MySQL服务器时

/etc/init.d/mysql restart
,容器将在后台重新启动

…但当我再次运行它并尝试重复步骤(2)和(3)时,它会给出相同的错误,当我再次重新启动MySQL服务器时,容器会再次在后台重新启动

Edit2:

在我删除行之后:

  - MYSQL_ALLOW_EMPTY_PASSWORD=hello
  - MYSQL_RANDOM_ROOT_PASSWORD=hello      - 
…它开始在Mac上工作,但在我提交容器并尝试进入MySQL外壳后,它给出了如下错误:

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

。。。。同样。

根据MySQL docker映像的官方文档

布尔变量包括MYSQL\u RANDOM\u ROOT\u PASSWORD, MYSQL\u一次性密码、MYSQL\u允许\u空密码和 MYSQL_LOG_控制台通过使用任意字符串设置来实现 非零长度。因此,将其设置为,例如,“0”, “假”或“不”并不意味着它们是假的,但实际上是假的 对。这是MySQL服务器容器的一个已知问题

这意味着您的配置:

  - MYSQL_ALLOW_EMPTY_PASSWORD=hello
  - MYSQL_RANDOM_ROOT_PASSWORD=hello
等于:

  - MYSQL_ALLOW_EMPTY_PASSWORD = true
  - MYSQL_RANDOM_ROOT_PASSWORD = true
这让我们想到了一点:

MYSQL\u RANDOM\u ROOT\u PASSWORD:当这个变量为true时(这是它的 默认状态,除非设置了MYSQL\u ROOT\u密码或 MYSQL_ALLOW_EMPTY_PASSWORD设置为true),是用于 服务器的根用户是在Docker容器启动时生成的。 密码打印到容器的标准输出,可通过 查看容器的日志

所以,要么检查容器日志文件,找到生成的随机密码
或者从文件中删除配置参数MYSQL\u RANDOM\u ROOT\u PASSWORD。

Docker映像通常设计为在前台运行单个进程或服务器,直到退出。标准的
mysql
图像是这样工作的:如果您
docker在没有
-d
的情况下运行mysql
,您将看到所有服务器日志都打印到stdout,并且没有立即获得shell的选项。您应该将容器中的交互式shell视为调试的便利,而不是Docker容器运行的通常方式

当您
docker运行--rm-it/bin/bash
时,它会运行交互式shell而不是数据库服务器,这就是为什么会出现“无法连接到服务器”错误。一般来说,您应该假设init.d脚本在Docker中不起作用;取决于具体的设置,它们可能会,但同样,它们不是Docker容器运行的通常方式

您可以在主机或其他地方安装
mysql
客户端二进制文件,并使用该二进制文件与容器中运行的服务器进行交互。您不需要容器中的交互式shell来执行此处描述的任何操作。

此处有点晚: 我也面临这个问题。 我拿了一个ubuntu映像并运行了apt-get-install-mysql-server,它在当前实例中运行得很好,但是在将它提交到映像中之后,它就不工作了,我也无法启动服务

所以在ubuntu中,我做了一个apt-get-install-mariadb-server;mysql
它工作得很好

你看过MySQL容器的使用手册了吗
-MYSQL\u ALLOW\u EMPTY\u PASSWORD=hello
-这是什么意思?而那
-MYSQL\u RANDOM\u ROOT\u PASSWORD=hello
?好吧,当我写这篇文章时,我很愚蠢:
MYSQL\u ALLOW\u EMPTY\u PASSWORD=hello MYSQL\u RANDOM\u ROOT\u PASSWORD=hello
在提交容器后,即使没有这两个愚蠢的选项
MYSQL\u ALLOW\u EMPTY\u PASSWORD=hello MYSQL\u RANDOM\u ROOT\u PASSWORD=hello
,mysql仍然无法工作。@ibodi发布您的完整docker撰写文件。请发布此docker文件。只需删除行
MYSQL\u ALLOW\u EMPTY\u PASSWORD=hello MYSQL\u RANDOM\u ROOT\u PASSWORD=hello
,但我想在容器中创建一个数据库,提交它,然后在运行创建的映像后,访问同一个数据库。
  - MYSQL_ALLOW_EMPTY_PASSWORD=hello
  - MYSQL_RANDOM_ROOT_PASSWORD=hello
  - MYSQL_ALLOW_EMPTY_PASSWORD = true
  - MYSQL_RANDOM_ROOT_PASSWORD = true