строка find и sed в Docker получила ошибку «Устройство или ресурс занят»

10

Эта проблема возникает только в 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?

Mithril
источник
Это временный файл, созданный sed. Когда вы сделаете модификацию на месте, sedсоздадите временный файл для работы, чтобы предотвратить повреждение вашего оригинала. Если что-то пошло не так, то замените оригинал временным. Но каков твой вопрос? Вы хотите знать, что является причиной этой ошибки или что sed8Ey5tDфайл?
Cuonglm
@cuonglm Я хочу знать, как добиться успеха.
Мифрил
Вы уверены, что у вас есть права на запись внутри контейнера?
user1700494
@ user1700494 пользователь root
Mithril
Вы можете попытаться принудительно sedне создавать резервную копию файла xargs sed -i'' "s/10.142.55.199/host02/g"(добавьте одинарные кавычки сразу после -iключа)
user1700494

Ответы:

10

Да, как вы обнаружили, файл монтируется Docker, что означает, что вы не можете изменять его inode из контейнера Docker. Но что, если вы измените только содержимое файла, не затрагивая его inode, это работает? Конечно, это так. Поэтому все, что вам нужно сделать, - это найти способ изменить только содержимое исходного файла, а не создавать новый файл, а затем заменить исходный.

Команда sedс параметром -iсоздает новый файл, а затем заменяет старый файл новым, что определенно изменит файл inode. Вот почему это дает вам ошибку.

Итак, какими способами можно изменить содержимое файла? Много много способов.

  1. перенаправление оболочки, например, echo abc > file
  2. команда cp, например,cp new old
  3. напор
  4. издание

Приведите несколько примеров того, как решить вашу проблему:

cpОбразом:

найти $ {BASIN_SPIDER_CONFIG_PATH} -типа f -name "* .json" | xargs -L1 bash -c 'sed "s / 10.142.55.199 / host02 / g" $ 1> /tmp/.intermediate-file-2431; cp /tmp/.intermediate-file-2431 $ 1; ' -

vimпуть

cat> / tmp / vim-temp-script << EOF
: установить nobackup backupcopy = да
: пусть я = 0
: пока 1
: пусть я + = 1
:% s / 10.142.55.199 / host02 / g
: если я> = argc ()
: перемена
: endif
: wn
: ENDWHILE
: WQ
EOF 
найти $ {BASIN_SPIDER_CONFIG_PATH} -типа f -name "* .json" | xargs vim -s / tmp / vim-temp-script

edпуть

найти $ {BASIN_SPIDER_CONFIG_PATH} -типа f -name "* .json" | xargs -L1 bash -c 'ed $ 1 << EOF
, С / 10.142.55.199 / host02 / г
WQ
EOF '-
Брюс
источник
0

Имхо, самый простой способ сделать это, используя в Dockerfile следующее:

RUN cp /etc/hosts /etc/hosts2 && sed -i 's/::1  localhost/::1/g' /etc/hosts2
CMD cat /etc/hosts2 >> /etc/hosts
Димитрис Мораитидис
источник