この問題は 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を変更することはできません。しかし、iノードに触れずにファイルの内容だけを変更すると機能しますか?当然ではない。したがって、新しいファイルを作成してから元のファイルを置き換えるのではなく、元のファイルの内容のみを変更する方法を見つけることができます。
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