【问题标题】:Docker Mysql container root password [mysqld listens port 0]Docker Mysql容器root密码【mysqld监听端口0】
【发布时间】:2016-09-23 15:12:20
【问题描述】:

今天我正在尝试让我的 Docker 环境正常工作!

在这件事上我遇到了一个相当大的问题:我的 MySQL 容器,扩展了 MySQL 官方 Docker 镜像,尽管在我的 docker-compose`.yml 中设置了 MYSQL_ROOT_PASSWORD 环境变量,但似乎无法创建 root 帐户。

我在这里复制我的 Docker 文件:

docker-compose.yml

大部分环境变量在脚本和应用程序中使用,独立于 MySQL 服务器。只有MYSQL_ROOT_PASSWORD 值得关注(也许这句话是我未能完成这项工作的原因......!)。

mysql:
    container_name: my_mysql
    build: mysql
    environment:
        - MYSQL_DATABASES=my-database
        - MYSQL_ROOT_PASSWORD=root
        - MYSQL_HOST=127.0.0.1
        - MYSQL_PORT=33306
        - MYSQL_USER=user
        - MYSQL_PASSWORD=password
        - MYSQL_MY_DATABASE=my-database
    ports:
        - "33306:3306"
    volumes:
        - "./volumes/mysql:/var/lib/mysql"

mysql/Dockerfile

dos2unix 命令用于将 Windows 行尾转换为 Unix。

自定义入口点的名称不同,以避免覆盖默认的 mysql 入口点脚本。

FROM mysql:5.7
MAINTAINER Wonderful Dev <wonderful.dev@wonderful-company.com>

RUN apt-get update && apt-get install -y dos2unix

COPY conf.d/custom.cnf /etc/mysql/conf.d/
COPY docker-entrypoint-initdb.d/databases.sh /docker-entrypoint-initdb.d/databases.sh
COPY my-entrypoint.sh /my-entrypoint.sh

RUN dos2unix /docker-entrypoint-initdb.d/databases.sh && dos2unix /my-entrypoint.sh && dos2unix /etc/mysql/conf.d/custom.cnf && apt-get --purge remove -y dos2unix && rm -rf /var/lib/apt/lists/*

RUN chmod a+x /docker-entrypoint-initdb.d/databases.sh && chown root:root /docker-entrypoint-initdb.d/databases.sh
RUN chmod a+x /my-entrypoint.sh && chown root:root /my-entrypoint.sh

ENTRYPOINT ["/entrypoint.sh", "/my-entrypoint.sh"]

CMD ["mysqld"]

mysql/my-entrypoint.sh

这个 chmod 命令是为了避免this kind of error

#!bin/bash

chmod 664 /etc/mysql/conf.d/custom.cnf

exec "$@"

mysql/config/custom.cnf

[mysqld]
default-storage-engine=INNODB
init-connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
bind-address        = 0.0.0.0
skip-external-locking
key_buffer      = 16M
max_allowed_packet  = 16M
thread_stack        = 192K
thread_cache_size       = 8
query_cache_limit   = 1M
query_cache_size        = 16M
expire_logs_days    = 10
max_binlog_size         = 100M

[mysqldump]
quick
quote-names
max_allowed_packet  = 16M

[isamchk]
key_buffer      = 16M

所有这些东西都在工作,除了我没有任何 root 访问权限,阻止我为我的应用程序创建数据库或 mysql 用户!

感谢您的任何建议:D!

编辑:经过几天的调查,以及docker-library/mysql 存储库中的一个问题,我们发现其中一个问题是 custom.cnf 中的配置键已弃用.

key_buffer => key_buffer_size

现在容器在构建后运行几秒钟,然后崩溃。

日志中的主要线索是那一行:

Version: '5.7.15'  socket: '/var/run/mysqld/mysqld.sock'  port: 0  MySQL Community Server (GPL)

我已经尝试了在 custom.cnf 中手动配置端口的建议解决方案,但它不起作用。容器尝试连接 MySQL 并由于端口而崩溃。

问题不是很明显,因为第二次启动容器时,初始化被跳过,配置好的端口,服务器工作正常。

问题是由于崩溃,初始化的结束没有执行,包括我的脚本和与用户一起创建的数据库。

所以我想知道为什么这个该死的 mysqld 在我构建后第一次启动容器时监听端口 0。

如果你有线索,我很乐意在这里讨论它!

【问题讨论】:

    标签: mysql docker docker-compose


    【解决方案1】:

    终于我弄明白了,感谢这个问题的人:https://github.com/docker-library/mysql/issues/82

    罪魁祸首是MYSQL_HOST 环境变量,它导致mysqld --initialize-insecure 命令失败。

    解决方案是将127.0.0.1 替换为localhost,生成以下docker-compose.yml

    mysql:
        container_name: my_mysql
        build: mysql
        environment:
            - MYSQL_DATABASES=my-database
            - MYSQL_ROOT_PASSWORD=root
            - MYSQL_HOST=localhost
            - MYSQL_PORT=33306
            - MYSQL_USER=user
            - MYSQL_PASSWORD=password
            - MYSQL_MY_DATABASE=my-database
        ports:
            - "33306:3306"
        volumes:
            - "./volumes/mysql:/var/lib/mysql"
    

    我希望它会帮助一些人:D!

    【讨论】:

    • 完美!像魅力一样工作。
    【解决方案2】:

    尝试反转您的入口点:

    ENTRYPOINT ["/my-entrypoint.sh", "/entrypoint.sh"]
    

    内置入口点正在寻找“mysqld”作为第一个参数,而不是“my-entrypoint.sh”。所以你想调用你的,然后使用传递的选项启动默认入口点。

    【讨论】:

    • 我试过了,但是后面的容器状态是exit 1!我在 Dockerfile 末尾删除了我的 CMD 指令,但是这次容器以状态 0 退出。我试图在我的入口点中删除 exec "$@" 指令,结果相同。提建议!编辑:我想明确一点,无论如何日志都是空的:(
    • 在没有任何输出或日志的情况下进行远程调试是相当困难的。
    猜你喜欢
    • 2016-05-27
    • 2015-04-27
    • 2019-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多