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

时间:2017-06-02 08:52:01

标签: mysql bash docker

在我的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
  • 我需要特殊选项来运行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

Check the Detailled docker-compose logs

2 个答案:

答案 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会为您处理所有这些。