tìm và chuỗi sed trong docker có lỗi `Thiết bị hoặc tài nguyên bận rộn`


10

Vấn đề này chỉ xảy ra trong container docker.

Chỉ findlà tốt:

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

find với sed

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

đưa ra một lỗi:

/xxx/config/sed8Ey5tD: Device or resource busy

Tôi không hiểu nó là gì sed8Ey5tD, lskhông thể nhìn thấy nó. Tôi nghĩ rằng đó là bởi docker, nhưng không thể tìm ra nó.

Làm thế nào để sedthành công?


OK, tôi thấy rằng tập tin đang được volumed bởi Docker, có volumes: /xxx/config.json : /xxx/config/config.json trong docker-compose.yml. Sau đó docker-compose down, tập tin có thể được chỉnh sửa. Nhưng làm thế nào để tôi chỉnh sửa tập tin mà không có docker-compose down?


Đó là tập tin tạm thời được tạo bởi sed. Khi bạn thực hiện sửa đổi tại chỗ, sedsẽ tạo một tệp tạm thời để xử lý để tránh làm hỏng bản gốc của bạn. Nếu bất cứ điều gì đúng, nó sẽ thay thế bản gốc bằng tạm thời. Nhưng câu hỏi của bạn là gì? Bạn muốn biết nguyên nhân gây ra lỗi đó hoặc sed8Ey5tDtập tin là gì?
cuonglm

@cuonglm Mình muốn biết làm thế nào để sed thành công.
Mithril

Bạn có chắc chắn rằng bạn có quyền ghi trong container không?
dùng1700494

@ user1700494 người dùng root
Mithril

bạn có thể cố gắng sedkhông tạo tập tin sao lưu xargs sed -i'' "s/10.142.55.199/host02/g"(thêm dấu ngoặc đơn ngay sau -ikhóa)
user1700494

Câu trả lời:


10

Có, như bạn đã tìm thấy, tập tin được gắn bởi docker, có nghĩa là bạn không được phép thay đổi inode của nó từ bên trong container docker. Nhưng, nếu bạn chỉ thay đổi nội dung của tệp mà không chạm vào nút của nó thì nó có hoạt động không? Chắc chắn, nó làm. Vì vậy, tất cả những gì bạn cần làm là tìm cách thay đổi nội dung của tệp gốc, thay vì tạo một tệp mới và sau đó thay thế tệp gốc.

Lệnh sedvới tùy chọn -ikhông tạo tệp mới, và sau đó thay thế tệp cũ bằng tệp mới, chắc chắn sẽ thay đổi tệp inode. Đó là lý do tại sao nó cung cấp cho bạn lỗi.

Vì vậy, những cách có thể thay đổi nội dung của tập tin? Nhiều cách.

  1. chuyển hướng vỏ, ví dụ, echo abc > file
  2. lệnh cp, ví dụ,cp new old
  3. vim
  4. ed

Cung cấp cho bạn một số ví dụ về cách khắc phục sự cố của bạn:

Các cpcách:

tìm $ {BASINinksIDER_CONFIG_PATH} -type f -name "* .json" | xargs -L1 bash -c 'sed "s / 10.142.55.199 / host02 / g" $ 1> /tmp/.inter liền-file-2431; cp /tmp/.interantly-file-2431 $ 1; ' -

các vimcách

mèo> / tmp / vim-temp-script << EOF
: đặt sao lưu nobackup = có
: hãy để tôi = 0
: trong khi 1
: hãy để tôi + = 1
:% s / 10.142.55.199 / máy chủ02 / g
: nếu tôi> = argc ()
: phá vỡ
: endif
: wn
: cuối cùng
: wq
EOF 
tìm $ {BASINinksIDER_CONFIG_PATH} -type f -name "* .json" | xargs vim -s / tmp / vim-temp-script

các edcách

tìm $ {BASINClickIDER_CONFIG_PATH} -type f -name "* .json" | xargs -L1 bash -c 'ed $ 1 << EOF
, s / 10.142.55.199 / máy chủ02 / g
wq
EOF '-

0

Imho, cách dễ nhất để làm là sử dụng cách sau trong Dockerfile:

RUN cp /etc/hosts /etc/hosts2 && sed -i 's/::1  localhost/::1/g' /etc/hosts2
CMD cat /etc/hosts2 >> /etc/hosts
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.