繁体   English   中英

Docker Mysql容器root密码[mysqld侦听端口0]

[英]Docker Mysql container root password [mysqld listens port 0]

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

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

我在这里复制我的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的/配置/ 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。

如果你有线索,我会很高兴在这里谈论它!

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

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

解决方案是用localhost替换127.0.0.1 ,它生成以下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!

尝试撤消您的入口点:

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

内置入口点正在寻找“mysqld”作为第一个arg,而不是“my-entrypoint.sh”。 因此,您希望调用您的,然后使用传递的选项启动默认入口点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM