senderle/bookworm-compose

Bundle custom my.cnf file.

Opened this issue · 4 comments

I generally change to put at least the following variables into the file read by maria/mysql on startup.

A couple of these are custom for my computer, but dividing datadir and tmpdir can occasionally be useful.

Most of these tune build performance. It's actually possible that they should be switched around when going into production mode.

They also assume a fairly large amount of RAM, so it's possible that for instances of less than 1 million documents--or bookworms willing to take the performance hit of not using memory tables--the approach here needs to be a bit different.

[mysqld]
tmp_table_size = 1024M
datadir = /drobo/mysql
tmpdir = /drobo/tmp
read_rnd_buffer_size = 8M
read_buffer_size = 8M
max_heap_table_size = 2048M # RAM
character_set_server = utf8
query_cache_size = 32M
bulk_insert_buffer_size = 512M
myisam_max_sort_file_size = 5500G
sort_buffer_size = 8M
query_cache_limit = 8M
max_allowed_packet = 512M
key_buffer_size = 2500M
query_cache_type = 1
### = = = THIS FILE SHOULD GENERALLY BE PLACED AT /etc/mysql/my.cnf = = = ###
myisam_sort_buffer_size = 5512M

So in the context of Docker, this raises some questions. For my purposes I've never needed anything more than the few config environment variables that the official MySQL image looks for. I don't think there are environment variables for these, so this might mean doing a custom image build? But I am not sure. Something we will have to look into. I love the convenience of using the official image, but it's not a big deal if we can't.

Looks easy. Both mariadb and mysql's standard images seem to have something like this in them:

mariadb. If you want to use a customized MySQL configuration, you can create your alternative configuration file in a directory on the host machine and then mount that directory location as /etc/mysql/conf.d inside the mariadb container.

mysql The default configuration for MySQL can be found in /etc/mysql/my.cnf, which may !includedir additional directories such as /etc/mysql/conf.d or /etc/mysql/mysql.conf.d. Please inspect the relevant files and directories within the mysql image itself for more details.

If /my/custom/config-file.cnf is the path and name of your custom configuration file, you can start your mysql container like this (note that only the directory path of the custom config file is used in this command):

$ docker run --name some-mysql -v /my/custom:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
This will start a new container some-mysql where the MySQL instance uses the combined startup settings from /etc/mysql/my.cnf and /etc/mysql/conf.d/config-file.cnf, with settings from the latter taking precedence.

Ah, of course, we can just mount it.

Digression: Now I'm wondering why we can't do the same thing with traefik, avoiding another custom build and further simplifying the project. I'm working with a lot of patterns from cookiecutter-django... they generally have very good reasons for these kinds of decisions, but I'm not sure about the why in that case.

Exists--just need to mount compose/mysql/conf.d in. Might be worth bundling large and small files.