首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >停靠容器中的MySQL服务器在提交容器后无法工作

停靠容器中的MySQL服务器在提交容器后无法工作
EN

Stack Overflow用户
提问于 2018-07-25 21:19:51
回答 2查看 3.8K关注 0票数 1

我创建了docker-compose.yml文件,该文件创建MySQL镜像,并将MySQL根用户的密码设置为"hello“。

代码语言:javascript
复制
# docker-compose.yml

version: '3.1'

services:

  mysql:
    image: mysql:5.6.40
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=hello
      - MYSQL_ALLOW_EMPTY_PASSWORD=hello
      - MYSQL_RANDOM_ROOT_PASSWORD=hello

然后我运行:

代码语言:javascript
复制
sudo docker-compose up # (1)

..。从包含此文件的目录中。

第一个问题是,新创建的容器开始在前台运行,而不是在bash中运行,我无法在不退出它的情况下将其放到后台,这可以通过Ctrl+C来完成,或者以某种方式进入bash,从这个过程中退出。

但是当我打开一个新的终端窗口并运行:

代码语言:javascript
复制
sudo docker exec -it bdebee1b8090 /bin/bash # (2)

...,其中bdebee1b8090是正在运行的容器的id,我输入bash,在这里我可以以根用户的身份进入hello shell,输入密码“MySQL”:

代码语言:javascript
复制
mysql -u root -p # (3)

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

然后我提交对容器的更改:

代码语言:javascript
复制
sudo docker commit bdebee1b8090 hello_mysql # (4)

...创建一个图像。然后,当我运行镜像时:

代码语言:javascript
复制
sudo docker run -it --rm hello_mysql /bin/bash # (5)

..。并尝试以根用户身份再次启动MySQL shell,输入密码"hello",我得到如下错误

代码语言:javascript
复制
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

甚至在我重启MySQL服务器之后:

代码语言:javascript
复制
/etc/init.d/mysql restart # (6)

...,我得到了同样的错误。

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

为什么会发生这种情况?

编辑:

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

代码语言:javascript
复制
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

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

代码语言:javascript
复制
/etc/init.d/mysql restart

...,容器将在后台重新启动。

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

Edit2:

在我删除行之后:

代码语言:javascript
复制
  - MYSQL_ALLOW_EMPTY_PASSWORD=hello
  - MYSQL_RANDOM_ROOT_PASSWORD=hello      - 

...it开始在Mac上工作,但在我提交容器并尝试进入MySQL外壳之后,它给出了错误,如下所示:

代码语言:javascript
复制
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

……再来一次。

EN

回答 2

Stack Overflow用户

发布于 2018-07-25 23:56:24

Docker镜像通常设计为在前台运行单个进程或服务器,直到它们退出。标准的mysql镜像是这样工作的:如果不使用-d执行docker run mysql,您将看到所有服务器日志都被打印到标准输出,并且没有立即获得外壳的选项。您应该将容器中的交互式shell看作是一种调试便利,而不是Docker容器通常运行的方式。

当您连接时,它运行的是交互式shell而不是数据库服务器,这就是为什么会出现“can‘t docker run --rm -it /bin/bash to server”错误的原因。一般来说,你应该假设像init.d脚本这样的东西不能在Docker中工作;这取决于它们可能的特定设置,但同样,它们不是Docker容器通常运行的方式。

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

票数 1
EN

Stack Overflow用户

发布于 2020-05-08 17:08:08

这里有点晚了:我也遇到了这个问题。我拿了一个ubuntu镜像并运行apt-get install mysql-server,它在当前实例中运行良好,但在提交到镜像后,它不起作用,我也无法启动服务。

所以在ubuntu中,我将其设置为apt-get install mariadb-server.在将其提交到新容器的镜像中之后,我运行了服务mysql start;mysql运行得很好!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51519943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档