执行CMD脚本时,无法在Dockerfile中启动Mysql
在我的Dockerfile width CMD [ "./myscript.sh" ]
的末尾,在bash脚本中执行mysqld
时,我无法启动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
- 我需要特殊的选项来运行mysql
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
检查详细的docker工人日志
我不知道一个好的解决scheme,但这里是一个可以使用的解决方法:摆脱你的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
初始化新实例:首次启动容器时,将使用提供的configurationvariables创build并初始化具有指定名称的新数据库。 此外,它将执行在/docker-entrypoint-initdb.d中find的具有扩展名.sh,.sql和.sql.gz的文件。 文件将按字母顺序执行。 通过将SQL转储装载到该目录中并提供自定义图像和贡献数据,可以轻松地填充您的mysql服务。 SQL文件将被默认导入到由MYSQL_DATABASEvariables指定的数据库中。
然而,这并不是你所喜欢的反应,我不知道你为什么不能从脚本启动mysqld。
很可能是因为你没有初始化你的数据库而发生的。 你需要运行
mysqld --initialize
要么
mysqld --initialize-insecure
(用于空的root密码)
如果你是第一次运行mysql。
mysql官方docker-entrypoint.sh
中的docker-entrypoint.sh
文件为您处理所有这些。