이 문제는 Docker 컨테이너에서만 발생합니다.
이것이 유일한 find
방법입니다:
find ${BASIN_SPIDER_CONFIG_PATH} -type f -name "*.json"
find
sed와 함께
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
수 없습니다. 나는 이것이 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가 확실히 변경됩니다. 그렇기 때문에 오류가 발생합니다.
그렇다면 파일의 내용을 변경하는 데 어떤 방법을 사용할 수 있습니까? 아주 많은 방법이 있습니다.
- 예를 들어 쉘 리디렉션은 다음과 같습니다.
echo abc > file
- 명령
cp
, 예를 들어,cp new old
- 윔
- 편집하다
다음은 문제를 해결하는 방법에 대한 몇 가지 예입니다.
방법 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
이동하지 않고 복사하도록 -c
with 를 사용하는 옵션이 있어 이 작업이 가능합니다.-i
이것은 작동합니다:
RUN sed -ci "s/localhost/foobar/g" /etc/hosts
그러나 "무엇을" 하거나 "무엇을 하는지"를 수행 sed -ic
하는 대신 으로 끝나는 백업 파일을 생성하므로 이 방법은 작동하지 않는다는 점에 주의하세요 ..c
sed -i -c
sed -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