Проблема связана с реализацией редактирования sed
in-place
. Когда вы редактируете файл с помощью опции -i
или --in-place
, на самом деле редактирование не происходит in-place
. sed
сохраняет изменения во временном файле, а затем использует его для замены исходного.
Бывает, что у вас нет разрешения на запись в каталог /etc
, где sed
пытается создать его временный файл.
Как указано в комментариях, наиболее вероятно, что команда запускается пользователем mysql
. Конечно, он не запускается как root
, поскольку у него достаточно привилегий для записи в /etc
:
bash-4.2# ls -ld /etc
drwxr-xr-x 1 root root 4096 Mar 27 15:04 /etc
Как видите, others
не имеет разрешения на запись. Изменение прав доступа или владельца самого каталога /etc
- очень плохая идея, и я не советую вам запускать эту команду как пользователь root
.
Самое простое решение - отказаться от использования * 1024. * опция, сохранить результат в каталоге, таком как /tmp
, к которому все имеют доступ:
bash-4.2# ls -ld /tmp
drwxrwxrwt 1 root root 4096 Mar 27 16:39 /tmp
и после этого заменить содержимое исходного файла содержимым временного.
Ваша команда может выглядеть следующим образом:
sed 's/^log-error=/#&/' /etc/my.cnf > /tmp/my.cnf && cat /tmp/my.cnf > /etc/my.cnf
Одно важное предупреждение:
Необходимо убедиться, что у вас есть разрешение write
для файла /etc/my.cnf
. Как вы можете видеть ниже, по умолчанию у вас также нет такого разрешения, поэтому ошибка возникнет позже, когда команда попытается записать в исходный файл конфигурации.
bash-4.2# ls -l /etc/my.cnf
-rw-r--r-- 1 root root 1239 Mar 27 15:04 /etc/my.cnf
Вам необходимо изменить в вашем Dockerfile
либо сделайте его доступным для редактирования всеми:
RUN chmod 666 /etc/my.cnf
или лучше:
RUN chown mysql /etc/my.cnf
чтобы сменить владельца на mysql
, если это пользователь, который выполняет сценарий entrypoint.sh
.
Пожалуйста, дайте мне знать, если это поможет.