【问题标题】:MySQL in Docker frozen at root password configDocker 中的 MySQL 在 root 密码配置中冻结
【发布时间】:2016-11-16 07:25:25
【问题描述】:

我有下一个 dockerfile:

FROM ubuntu:16.04
RUN apt-get update && apt-get upgrade -y && apt-get install -y apache2 mysql-server mysql-client

之后,Docker build 询问我 root 的密码:

While not mandatory, it is highly recommended that you set a password for the
MySQL administrative "root" user.

If this field is left blank, the password will not be changed.

New password for the MySQL "root" user:

我输入了密码,但是,它只是停留在那个状态。

我可以这样安装mysql吗?我不想自动安装它

【问题讨论】:

    标签: mysql docker dockerfile


    【解决方案1】:

    接受的答案在某种抽象意义上可能是正确的,但它与手头的问题完全无关。您需要一种静态指定密码的方法。除非您使用official image,否则无论您是否遵循“一个进程,一个容器”的教条,您都需要它。

    答案here 说明了如何使用,但它遗漏了一个关键设置:您仍然必须告诉debconf 使用Noninteractive 前端,如here 所述。

    这是一个基于上述内容的工作 Dockerfile 示例。

    FROM ubuntu:latest
    MAINTAINER Jonathan Strange <jstrange@norrell.edu>
    RUN apt-get update \
        && apt-get install -y apt-utils \                                           
        && { \
            echo debconf debconf/frontend select Noninteractive; \
            echo mysql-community-server mysql-community-server/data-dir \
                select ''; \
            echo mysql-community-server mysql-community-server/root-pass \
                password 'JohnUskglass'; \
            echo mysql-community-server mysql-community-server/re-root-pass \
                password 'JohnUskglass'; \
            echo mysql-community-server mysql-community-server/remove-test-db \
                select true; \
        } | debconf-set-selections \
        && apt-get install -y mysql-server apache2 python python-django \
            python-celery rabbitmq-server git
    

    这与official Dockerfile 所做的并没有太大的不同——尽管它们处理实际密码配置的方式有所不同。

    有些人已经成功通过setting the DEBIAN_FRONTEND环境变量到noninteractive,像这样:

    ENV DEBIAN_FRONTEND noninteractive
    

    但是,这似乎并不适用于所有情况。事实证明,直接使用debconf 对我来说更可靠。

    【讨论】:

    • 容器内。我无法使用 mysql -u root -proot 启动 mysql 控制台,给出 ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)。
    • @Vinujan.S 这是一个不同的问题。如果此站点上尚未将其作为问题提出,则应将其作为新问题提出。
    • 我稍后解决了这个问题。但是我改变了机制,让mysql有单独的容器。感谢您的答复。真的很感激。
    • 我想知道第二个 echo 命令中空字符串 '' 的意义是什么。它导致 echo 在单词 'select' 和换行符之间输出一个空白,因为 echo 找到了一个空的第 4 个命令行参数。但是这个空白真的与 debconf-set-selections 相关吗?
    • 这部分令人不安:“有些人通过将 DEBIAN_FRONTEND 环境变量设置为非交互式已经取得了成功,例如:ENV DEBIAN_FRONTEND noninteractive 但是,这似乎并不适用于所有情况”。可重复性不是容器的一个关键承诺,即无论谁执行容器/构建文件,结果总是相同的吗? (顺便说一句,我上一条评论中的空字符串部分可以省略 - 相同的 debconf 行为)
    【解决方案2】:

    如果 sendarle 的回答不是很清楚,请将如下所示的环境 DEBIAN_FRONTEND 添加到您的 Dockerfile 中:

    FROM ubuntu:latest
    
    ENV DEBIAN_FRONTEND noninteractive   
    
    RUN apt-get update \
      && apt-get install -y mysql-server mysql-client libmysqlclient-dev 
       --no-install-recommends \
      && apt-get clean \
      && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
    

    【讨论】:

    • 容器内。我无法使用 mysql -u root -proot 启动 mysql 控制台,给出 ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)。
    【解决方案3】:

    Docker的方式是“一个容器一个进程”。 您需要一个用于 apache 的容器和一个用于 mysql 的容器。 你可以使用official php imageofficial mysql image

    我建议使用 docker-compose 链接容器

    【讨论】:

    • 我打算使用Supervisor...哪个选项更好? docker-compose 还是主管?
    • 我们以前用supervisord,但现在我们使用单独的容器。它提供了一些优势。我们可以使用官方镜像和更新,只更新集群的一部分,快速回滚到之前的容器版本。
    • 这个真的很有意思,我试试docker-compose
    • 虽然这提供了一种解决方法,但这并不能回答问题。
    猜你喜欢
    • 2021-05-14
    • 2021-11-17
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    • 2015-01-24
    • 2012-02-08
    • 2018-06-09
    相关资源
    最近更新 更多