docker에서 문자열을 찾아 sed하면 "장치 또는 리소스가 사용 중입니다"라는 오류가 발생합니다.

docker에서 문자열을 찾아 sed하면 "장치 또는 리소스가 사용 중입니다"라는 오류가 발생합니다.

이 문제는 Docker 컨테이너에서만 발생합니다.

이것이 유일한 find방법입니다:

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

findsed와 함께

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

나는 그것이 무엇인지 이해하지 못하고 sed8Ey5tDls수 없습니다. 나는 이것이 docker에 의해 작성된 것 같지만 그것을 알아낼 수는 없습니다.

성공 하는 방법은 무엇입니까 sed?


좋아요, 파일 이 docker에 의해 롤업되고 volumes: /xxx/config.json : /xxx/config/config.json 있으며 docker-compose.yml. docker-compose down하지만 그렇지 않은 경우 파일을 어떻게 편집합니까 docker-compose down?

답변1

예, 아시다시피 파일은 docker에 의해 마운트됩니다. 즉, docker 컨테이너 내부에서 해당 inode를 변경할 수 없습니다. 하지만 아이노드를 건드리지 않고 파일 내용만 변경하면 작동할까요? 당연하지. 따라서 새 파일을 만든 다음 원본 파일을 바꾸는 대신 원본 파일의 내용만 변경하는 방법을 찾으면 됩니다.

sed옵션이 포함된 명령은 -i새 파일을 만든 다음 이전 파일을 새 파일로 대체합니다. 그러면 파일 inode가 확실히 변경됩니다. 그렇기 때문에 오류가 발생합니다.

그렇다면 파일의 내용을 변경하는 데 어떤 방법을 사용할 수 있습니까? 아주 많은 방법이 있습니다.

  1. 예를 들어 쉘 리디렉션은 다음과 같습니다.echo abc > file
  2. 명령 cp, 예를 들어,cp new old
  3. 편집하다

다음은 문제를 해결하는 방법에 대한 몇 가지 예입니다.

방법 cp:

${BASIN_SPIDER_CONFIG_PATH} -type f -name "*.json" |매개변수 찾기-L1 bash -c 'sed "s/10.142.55.199/host02/g" $1 > /tmp/.intermediate-file-2431 cp /tmp/.intermediate-file-2431 $1;'

vim도로

고양이 > /tmp/vim-temp-script <<EOF
:백업 백업 복사본 없음 설정=예
: 나 = 0 하자
: 동시에 1
:나에게 += 1을 줘
:%s/10.142.55.199/host02/g
: i >= argc()인 경우
: 나머지
: 혹시라도
:wn
:마침내
:wq
EOF
${BASIN_SPIDER_CONFIG_PATH} -type f -name "*.json" |매개변수 찾기vim -s /tmp/vim-temp-script

ed도로

${BASIN_SPIDER_CONFIG_PATH} 찾기 -type f -name "*.json"|xargs-L1 bash -c 'ed $1 <<EOF
,s/10.142.55.199/host02/g
웨커
EOF'--

답변2

sed이동하지 않고 복사하도록 -cwith 를 사용하는 옵션이 있어 이 작업이 가능합니다.-i

이것은 작동합니다:

RUN sed -ci "s/localhost/foobar/g" /etc/hosts

그러나 "무엇을" 하거나 "무엇을 하는지"를 수행 sed -ic하는 대신 으로 끝나는 백업 파일을 생성하므로 이 방법은 작동하지 않는다는 점에 주의하세요 ..csed -i -csed -ci

오늘은 이번 학습을 통해 도커 스크립트를 정리했습니다 :)

답변3

IMHO 가장 쉬운 방법은 Dockerfile에서 다음을 사용하는 것입니다.

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

관련 정보