Docker MySQL容器的root密码 [mysqld监听端口0]

5
今天,我在尝试搭建我的Docker环境!但是,在这个过程中,我遇到了一个问题:尽管在我的docker-compose.yml文件中设置了MYSQL_ROOT_PASSWORD环境变量,我的MySQL容器(继承自MySQL官方Docker镜像)似乎无法创建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命令的目的是为了避免这种错误

#!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

所有这些东西都能正常工作,除了我没有根访问权限,无法为我的应用程序创建数据库或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。

如果您有线索,我会很高兴听到的!

2个回答

17

最终我找到了解决方法,感谢这个问题上的人们: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 !


1
完美!像魔法一样奏效。 - Sai Kishore

1
尝试反转您的入口点:

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

内置入口点寻找第一个参数为“mysqld”,而不是“my-entrypoint.sh”。因此,您需要调用自己的入口点,然后使用传递的选项启动默认入口点。

我尝试了一下,但容器状态在此之后是“exit 1”!我在Dockerfile末尾删除了我的“CMD”指令,但这次容器以状态0退出。我尝试删除入口点中的“exec“$@”指令,结果相同。感谢建议!编辑:我想澄清的是,在任何情况下日志都是空的:( - Kern
没有任何输出或日志,远程调试会非常困难。 - BMitch

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