Dockerfile CMD无法为MySQL 5.7镜像执行多命令问题排查
MySQL容器创建异常数据目录的原因及解决方法
问题原因
你用的是exec格式的CMD(数组写法),这种模式下Docker不会启动Shell解析命令里的分号、管道这类语法,而是直接把整个字符串"--datadir=/data ; sh db_translations.sh"当作MySQL的单个参数传递。MySQL会把--datadir=后面的所有内容(包括; sh db_translations.sh)都识别成数据目录的路径,自然就创建了名字奇怪的目录。
解决方法
方法1:改用Shell格式的CMD
把CMD写成字符串形式,Docker会自动调用/bin/sh解析命令,分号就能正常分隔两个操作:
CMD "mysqld --datadir=/data && sh db_translations.sh"
或者显式指定Shell执行,避免歧义:
CMD ["/bin/sh", "-c", "mysqld --datadir=/data && sh db_translations.sh"]
方法2:结合ENTRYPOINT和CMD
如果想要保留exec格式的特性,可以通过组合ENTRYPOINT和CMD实现:
ENTRYPOINT ["/bin/sh", "-c"] CMD ["mysqld --datadir=/data & sh db_translations.sh && wait"]
这种写法会先启动MySQL后台进程,执行脚本后等待进程结束,避免容器提前退出。
内容的提问来源于stack exchange,提问作者Haytham
相关产品推荐
相关产品推荐

