今天我正在努力使我的Docker环境正常工作!
在这件事情上我遇到了一个很大的问题:我的MySQL容器,扩展MySQL官方Docker镜像,似乎无法创建root帐户,尽管在{{MYSQL_ROOT_PASSWORD
环境变量中设置了docker-compose`.yml
1}}。
我在这里复制我的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"]
此chmod命令旨在避免this kind of error
#!bin/bash
chmod 664 /etc/mysql/conf.d/custom.cnf
exec "$@"
[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。
如果你有线索,我会很高兴在这里谈论它!
答案 0 :(得分:8)
最后我明白了,感谢这个问题的人: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 :(得分:1)
尝试撤消您的入口点:
ProgrammingError
内置入口点正在寻找“mysqld”作为第一个arg,而不是“my-entrypoint.sh”。所以你想打电话给你,然后使用传递的选项旋转默认入口点。