在我的Dockerfile宽度mysqld
末尾的bash脚本中执行CMD [ "./myscript.sh" ]
时,我无法启动mysql demon。但是,CMD [ "mysqld" ]
有效。
Dockerfile
FROM mysql:5.7
USER mysql
COPY ./setconf.sh .
COPY config/my.cnf /etc/mysql/conf.d
CMD [ "./setconf.sh" ]
# CMD ["mysqld"]
# This command works !
我收到了这个错误:
[ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it
[ERROR] Fatal error: Can't open and lock privilege tables: Table 'mysql.user' doesn't exist
搬运工-compose.yml
mysql:
build: mysql
environment:
MYSQL_PASSWORD: pass
MYSQL_ROOT_PASSWORD: pass
HOST: mysql
MYSQL_ROOT_HOST: mysql
ports:
- "3306:3306"
./ setconf.sh
mysqld
注意:
docker-compose down
的my.cnf
[mysqld]
default-storage-engine = INNODB
sql-mode = "STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
transaction-isolation = READ-COMMITTED
innodb_flush_log_at_trx_commit = 1
init_connect = "set session autocommit=0"
log_bin_trust_function_creators = 1
max_sp_recursion_depth = 100
lower_case_table_names = 1
thread_stack = 256K
max_allowed_packet = 16M
答案 0 :(得分:1)
我不知道一个好的解决方案,但这是一个可以使用的解决方法: 摆脱你CMD并使用
CMD ["mysqld"]
代替。然后将您的脚本复制到/docker-entrypoint-initdb.d/:
COPY /configureDB.sh /docker-entrypoint-initdb.d/
启动mysql后,您的脚本将立即执行。有关详细信息,请参阅mysql docker文档:https://github.com/docker-library/docs/tree/master/mysql#initializing-a-fresh-instance
初始化新实例:首次启动容器时,将创建具有指定名称的新数据库,并使用提供的配置变量进行初始化。此外,它将执行扩展名为.sh,.sql和.sql.gz的文件,这些文件位于/docker-entrypoint-initdb.d中。文件将按字母顺序执行。您可以通过将SQL转储装入该目录并使用提供的数据提供自定义映像来轻松填充您的mysql服务。默认情况下,SQL文件将导入到MYSQL_DATABASE变量指定的数据库中。
然而,这不是你想要的回应,我不知道为什么你不能从脚本中启动mysqld。
答案 1 :(得分:1)
很可能它正在发生,因为您没有初始化您的数据库。你需要运行
mysqld --initialize
或
mysqld --initialize-insecure
(对于空root密码)
如果您是第一次运行mysql。
mysql官方docker镜像中的docker-entrypoint.sh
file会为您处理所有这些。