Как правило, вы не должны пытаться напрямую редактировать файлы в контейнерах. Эти изменения будут потеряны, как только контейнер будет остановлен и удален; это происходит очень регулярно, так как многие параметры Docker могут быть установлены только во время запуска, и стандартный способ обновления программного обеспечения в контейнере - это воссоздание его с более новым образом. В вашем случае вы также не можете в режиме реального времени редактировать файл конфигурации, необходимый процессу основного контейнера во время запуска, поскольку он уже прочитает файл конфигурации к тому времени, когда вы сможете его редактировать.
Правильный способ сделать это - добавить измененный файл конфигурации во время запуска контейнера. Если вы этого еще не сделали, извлеките файл конфигурации по умолчанию из образа
docker run --rm mysql:8 cat /etc/mysql/my.cnf > my.cnf
и отредактируйте его непосредственно на хосте, используя выбранный вами текстовый редактор. Когда вы запускаете контейнер, введите измененный файл
docker run -v $PWD/my.cnf:/etc/mysql/my.cnf ... mysql:8
или, в Docker Compose,
volumes:
- ./my.cnf:/etc/mysql/my.cnf
Документация по * Docker Hub mysql
имеет еще несколько предложений о том, как это установить; см. «Использование пользовательского MySQL файла конфигурации» там.
Хотя docker exec
является чрезвычайно полезным инструментом отладки, он не должен быть частью вашего основного рабочего процесса, и я бы рекомендовал избегать его в таких случаях (При использовании подхода bind-mount вы можете добавить измененный файл конфигурации к вашей системе управления версиями и слепо docker-compose up
, как обычно, не зная этой детали; подход docker exec
, который вы должны будете помнить и повторять вручную каждый раз, когда вы запустил стек контейнера.)
Также обратите внимание, что вам вообще не нужно sudo
в Docker. В каждом контексте, где вы можете что-то запустить (Dockerfiles, docker run
, docker exec
), есть какой-то способ явно указать идентификатор пользователя, поэтому вы можете docker exec -u root ...
. sudo
обычно зависит от таких вещей, как пользователи, имеющие пароли и интерактивные подсказки, которые хорошо подходят для администрирования реального Linux хоста, но не соответствуют типичной Docker среде.