Docker的Mysql容器根密码

今天我试图让我的Docker环境工作!

在这个问题上,我遇到了一个相当的问题:我的MySQL容器,扩展了MySQL官方Docker镜像,似乎无法创buildroot帐户,尽pipe在我docker-compose`.yml设置了MYSQL_ROOT_PASSWORD环境variables。

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

泊坞窗,compose.yml

大部分的环境variables都在脚本和应用程序中独立于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的/configuration/ 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权限,阻止我创build数据库或mysql用户为我的应用程序!

谢谢你的build议:D!

编辑 :经过几天的调查,并在docker-library/mysql存储库中的问题,我们发现其中一个问题是custom.cnf中不推荐使用的configuration项。

 key_buffer => key_buffer_size 

现在容器运行几秒钟后,build立,然后崩溃。

日志中的主要线索是这样的:

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

我已经尝试了一个build议的解决scheme来手动configurationcustom.cnf中的端口,但它不起作用。 容器试图连接到MySQL并由于端口而崩溃。

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

事情是由于崩溃,初始化的结束没有执行,包括我的脚本和数据库创build用户。

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

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

尝试颠倒你的切入点:

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

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

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

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

解决方法是用localhostreplace127.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!