Файл my.cnf не обновляется в контейнере docker — wodby/mariadb
Сегодня я столкнулся с проблемой, как обновить файл my.cnf для MySQL в контейнере docker — wodby/mariadb, если он никак не обновляется. И при этом, что вы только не делали. Все дело в том, что мне стало нужно в директиву [mysqld] прописать настройку sql_mode. И я потратил на это полдня.
В итоге я выкатил эту настройку, хотя закончить задачу по работе мне это не помогло.
В чем была проблема?
Я заменял файл my.cnf своей модифицированной его версией (где sql_mode = ‘ONLY_FULL_GROUP_BY’) в контейнере wodby/mariadb. Потом перезагрузил через docker-compose up контейнеры и в итоге никаких изменений в контейнере mariadb не происходило – файл my.cnf в нем не обновлялся (моя строчка sql_mode = ‘ONLY_FULL_GROUP_BY’ чудесным образом исчезала).
Причина такого поведения была не в моих неправильных действиях, а в скрипте docker-entrypoint.sh, который был прописан в конфиге контейнера wodby/mariadb.
1 | $ sudo docker inspect ksup_mariadb |
1 2 3 4 5 6 7 8 9 | [ { "Id": "41155b263396640af87568bf2818616914da552c161c9c451d510f9c2dd59986", "Created": "2024-05-16T11:46:29.076685512Z", "Path": "/docker-entrypoint.sh", "Args": [ "mysqld" ], … |
Я скопировал этот файлик себе локально.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | $ sudo docker cp ksup_mariadb:/docker-entrypoint.sh ./docker-entrypoint.sh Successfully copied 856B to /home/dev/ksup.local/.vscode/db/docker-entrypoint.sh $ sudo cat ./docker-entrypoint.sh #!/usr/bin/env bash set -e if [[ -n "${DEBUG}" ]]; then set -x fi sudo init_volumes minor_ver=$(echo "${MARIADB_VER}" | grep -oE '^[0-9]+\.[0-9]+') gotpl "/etc/gotpl/${minor_ver}/my.cnf.tmpl" > "/etc/mysql/my.cnf" ... |
Видно, что скрипт docker-entrypoint.sh при создании контейнера тупо копировал свой шаблон файла my.cnf и затирал тот, который я тщетно модифицировал в контейнере.
Удаляем строку gotpl «/etc/gotpl/${minor_ver}/my.cnf.tmpl» > «/etc/mysql/my.cnf» с помощью nano.
1 | $ sudo nano ./docker-entrypoint.sh |
Копируем отредактированный файл обратно в контейнер.
1 2 3 4 5 6 7 8 9 | $ sudo docker cp ./docker-entrypoint.sh ksup_mariadb:/docker-entrypoint.sh $ sudo docker exec -it -u root ksup_mariadb bash $ find / -name my.cnf /etc/mysql/my.cnf $ cat /etc/mysql/my.cnf |
1 2 3 4 5 6 | ... [mysqld] user = mysql bind-address = 0.0.0.0 basedir = /usr ... |
1 2 | $ exit $ sudo docker cp ksup_mariadb:/etc/mysql/my.cnf ./my.cnf |
Добавляем наш конфиг sql_mode = ‘ONLY_FULL_GROUP_BY’ в my.cnf в секцию [mysld]
1 2 3 4 5 6 7 8 | $ nano ./my.cnf ... [mysqld] sql_mode = 'ONLY_FULL_GROUP_BY' user = mysql bind-address = 0.0.0.0 basedir = /usr ... |
Копируем отредактированный файл обратно в контейнер
1 | $ sudo docker cp ./my.cnf ksup_mariadb:/etc/mysql/my.cnf |
Создаем свой модифицированный образ
1 | $ sudo docker commit ksup_mariadb gamelot_mariadb |
Правим файл compose.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | services: mariadb: image: wodby/mariadb:$MARIADB_TAG container_name: "${PROJECT_NAME}_mariadb" stop_grace_period: 30s environment: MYSQL_ROOT_PASSWORD: $DB_ROOT_PASSWORD MYSQL_DATABASE: $DB_NAME MYSQL_USER: $DB_USER MYSQL_PASSWORD: $DB_PASSWORD MYSQL_TRANSACTION_ISOLATION: READ-COMMITTED ports: - 3306:3306 volumes: - ./.vscode/db/:/var/lib/mysql |
Строку image: wodby/mariadb:$MARIADB_TAG заменяем на gamelot_mariadb
Поднимаем контейнеры командой docker-compose up.
Проверяем изменения
1 2 3 4 | $ sudo docker exec -it -u root ksup_mariadb bash $ cat /etc/mysql/my.cnf | grep sql_mode sql_mode = 'ONLY_FULL_GROUP_BY' $ exit |
Если все было проделано правильно, нужная настройка появится 100%.
Запрос в mysql:
1 | SELECT @@sql_mode; |
Ответ mysql, ради чего было потрачено полдня и заработана головная боль):
ONLY_FULL_GROUP_BY

