在执行CMD脚本时,无法在Dockerfile中启动Mysql

3

当我在Dockerfile的末尾使用CMD [ "./myscript.sh" ]执行mysqld时,我无法启动mysql守护程序。但是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

docker-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-compose日志

2个回答

3
我不知道有什么好的解决方案,但是这里有一个解决方法可以使用:摆脱你的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

初始化新实例:当容器首次启动时,将创建一个指定名称的新数据库,并使用提供的配置变量进行初始化。此外,它会执行在/docker-entrypoint-initdb.d中找到的具有扩展名.sh、.sql和.sql.gz的文件。文件将按字母顺序执行。您可以通过将SQL转储加载到该目录中并提供包含贡献数据的自定义映像来轻松填充mysql服务。默认情况下,SQL文件将导入到由MYSQL_DATABASE变量指定的数据库中。

然而,这不是你要寻找的答案,我不知道为什么您无法从脚本启动mysqld。


1
很可能是因为您没有初始化数据库。您需要运行: mysqld --initialize 或者 mysqld --initialize-insecure(对于空的root密码)
如果您第一次运行mysql。
mysql官方docker镜像中的docker-entrypoint.shfile会为您处理所有这些内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接