我有一个全新的Laravel 8安装和mysql:8.0镜像。
我想向MySql添加一些配置。
这是我在docker-compose.yml
:中的mysql服务
mysql:
image: 'mysql:8.0'
ports:
- '${FORWARD_DB_PORT:-3306}:3306'
environment:
MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
MYSQL_DATABASE: '${DB_DATABASE}'
MYSQL_USER: '${DB_USERNAME}'
MYSQL_PASSWORD: '${DB_PASSWORD}'
MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
volumes:
- 'sailmysql:/var/lib/mysql'
networks:
- sail
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-p${DB_PASSWORD}"]
retries: 3
timeout: 5s
这很好用。如果我现在尝试将my.cnf
添加到卷中,如下所示:
volumes:
- 'sailmysql:/var/lib/mysql'
- './docker/8.0/my.cnf:/etc/mysql/my.cnf'
并用sail down
和sail up
重新启动容器,然后它突然失败:
mysql_1 | 2021-11-06T13:26:52.465786Z 0 [ERROR] [MY-010095] [Server] Failed to access directory for --secure-file-priv. Please make sure that directory exists and is accessible by MySQL Server. Supplied value : /var/lib/mysql-files
mysql_1 | 2021-11-06T13:26:52.465813Z 0 [ERROR] [MY-010119] [Server] Aborting
如何包含配置?
刚刚偶然发现你的问题,因为我也有同样的问题。我正在使用Laravel和Sail以及当前的mysql docker容器。
我检查了docker容器,mysql配置保存如下:
基本my.cnf
文件位于此处:
/etc/my.cnf
(还有一个文件夹/etc/my.cnf.d/
,但在那里放一个自定义的.cnf文件不起作用,因为它不包括在/etc/my.cnf
中(
从docker容器复制/etc/my.cnf
的原始内容后,我在docker-compose.yml
文件中所做的是:
volumes:
- 'sail-mysql:/var/lib/mysql'
- './docker/8.2/my.cnf:/etc/my.cnf'
我需要它,因为我得到了MySQL: Error Code: 1118 Row size too large (> 8126).
,可能是这样修复的:
innodb_strict_mode = OFF
您可以通过将loggin记录到这样的运行容器中来检查mysql-doker配置(请参阅https://hub.docker.com/_/mysql):
$ docker exec -it nameOfMysqlContainer bash
登录时列出etc文件夹中的文件:
$ ls -la /etc/
自定义my.cnf
覆盖设置(pid文件、socke和datadir(,导致mysql服务失败。为了不覆盖它们,需要保留原始my.cnf
文件,即:
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
secure-file-priv= NULL
所以在你的情况下,你必须添加:
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
secure-file-priv= NULL
innodb_io_capacity = 2000
innodb_read_io_threads = 64
innodb_thread_concurrency = 64
innodb_write_io_threads = 64