Эта проблема возникает только в Docker-контейнере.
Только find
хорошо
find ${BASIN_SPIDER_CONFIG_PATH} -type f -name "*.json"
find
с седом
find ${BASIN_SPIDER_CONFIG_PATH} -type f -name "*.json"|xargs sed -i "s/10.142.55.199/host02/g"
выдает ошибку:
/xxx/config/sed8Ey5tD: Device or resource busy
Я не понимаю, что это такое sed8Ey5tD
, ls
не вижу этого. Я думаю, что это докер, но не могу понять это.
Как добиться sed
успеха?
Хорошо, я обнаружил, что файл заполняется докером, есть volumes: /xxx/config.json : /xxx/config/config.json
в docker-compose.yml
. После docker-compose down
этого файл можно редактировать. Но как мне отредактировать файл без docker-compose down
?
sed
. Когда вы сделаете модификацию на месте,sed
создадите временный файл для работы, чтобы предотвратить повреждение вашего оригинала. Если что-то пошло не так, то замените оригинал временным. Но каков твой вопрос? Вы хотите знать, что является причиной этой ошибки или чтоsed8Ey5tD
файл?sed
не создавать резервную копию файлаxargs sed -i'' "s/10.142.55.199/host02/g"
(добавьте одинарные кавычки сразу после-i
ключа)Ответы:
Да, как вы обнаружили, файл монтируется Docker, что означает, что вы не можете изменять его inode из контейнера Docker. Но что, если вы измените только содержимое файла, не затрагивая его inode, это работает? Конечно, это так. Поэтому все, что вам нужно сделать, - это найти способ изменить только содержимое исходного файла, а не создавать новый файл, а затем заменить исходный.
Команда
sed
с параметром-i
создает новый файл, а затем заменяет старый файл новым, что определенно изменит файл inode. Вот почему это дает вам ошибку.Итак, какими способами можно изменить содержимое файла? Много много способов.
echo abc > file
cp
, например,cp new old
Приведите несколько примеров того, как решить вашу проблему:
cp
Образом:vim
путьed
путьисточник
Имхо, самый простой способ сделать это, используя в Dockerfile следующее:
источник