temukan dan sed string di buruh pelabuhan mendapat kesalahan `Perangkat atau sumber daya sibuk`

10

Masalah ini hanya terjadi pada wadah buruh pelabuhan.

Hanya findbaik-baik saja:

find ${BASIN_SPIDER_CONFIG_PATH} -type f -name "*.json"

find dengan sed

find ${BASIN_SPIDER_CONFIG_PATH} -type f -name "*.json"|xargs sed -i "s/10.142.55.199/host02/g"

memberikan kesalahan:

/xxx/config/sed8Ey5tD: Device or resource busy

Saya tidak mengerti apa itu sed8Ey5tD, lstidak bisa melihatnya. Saya pikir itu dengan buruh pelabuhan, tetapi tidak bisa mengetahuinya.

Bagaimana cara mencapai sedkesuksesan?


OK, saya menemukan file itu sedang di-volum oleh buruh pelabuhan, ada volumes: /xxx/config.json : /xxx/config/config.json di docker-compose.yml. Setelah itu docker-compose down, file dapat diedit. Tetapi bagaimana cara mengedit file tanpa docker-compose down?

Mithril
sumber
Ini file sementara yang dibuat oleh sed. Ketika Anda melakukan modifikasi di tempat, sedakan membuat file sementara untuk dikerjakan untuk mencegah rusaknya dokumen asli Anda. Jika ada yang benar, maka ganti yang asli dengan yang sementara. Tapi apa pertanyaanmu? Anda ingin tahu yang menyebabkan kesalahan itu atau apa itu sed8Ey5tDfile?
cuonglm
@cuonglm Saya ingin tahu cara membuat kesuksesan.
Mithril
Anda yakin memiliki izin menulis di dalam wadah?
user1700494
@ user1700494 pengguna root
Mithril
Anda dapat mencoba memaksa seduntuk tidak membuat file cadangan xargs sed -i'' "s/10.142.55.199/host02/g"(tambahkan tanda kutip tunggal tepat setelah -ikunci)
user1700494

Jawaban:

10

Ya, seperti yang Anda temukan, file tersebut dipasang oleh buruh pelabuhan, yang berarti Anda tidak diizinkan untuk mengubah inode dari dalam wadah buruh pelabuhan. Tapi, bagaimana jika Anda hanya mengubah konten file tanpa menyentuh inode-nya, apakah itu berfungsi? Tentu saja. Jadi yang perlu Anda lakukan adalah menemukan cara untuk mengubah konten file asli saja, daripada membuat file baru dan kemudian ganti yang asli.

Perintah seddengan opsi -imemang membuat file baru, dan kemudian mengganti file lama dengan yang baru, yang pasti akan mengubah inode file. Itu sebabnya itu memberi Anda kesalahan.

Jadi, cara mana yang bisa mengubah konten file? Banyak cara.

  1. pengalihan shell, misalnya, echo abc > file
  2. perintah cp, misalnya,cp new old
  3. vim
  4. ed

Berikan Anda beberapa contoh cara memperbaiki masalah Anda:

The cpcara:

temukan $ {BASIN_SPIDER_CONFIG_PATH} -type 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; ' -

The vimcara

cat> / tmp / vim-temp-script << EOF
: atur nobackup backupcopy = ya
: let i = 0
: sementara 1
: biarkan i + = 1
:% s / 10.142.55.199 / host02 / g
: if i> = argc ()
: istirahat
: berakhir jika
: wn
: endwhile
: wq
EOF 
menemukan $ {BASIN_SPIDER_CONFIG_PATH} -type f -name "* .json" | xargs vim -s / tmp / vim-temp-script

The edcara

temukan $ {BASIN_SPIDER_CONFIG_PATH} -type f -name "* .json" | xargs -L1 bash -c 'ed $ 1 << EOF
, s / 10.142.55.199 / host02 / g
wq
EOF '-
Bruce
sumber
0

Imho, cara termudah untuk dilakukan adalah dengan menggunakan yang berikut di Dockerfile:

RUN cp /etc/hosts /etc/hosts2 && sed -i 's/::1  localhost/::1/g' /etc/hosts2
CMD cat /etc/hosts2 >> /etc/hosts
Dimitris Moraitidis
sumber