执行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 文件为您处理所有这些。