2016-07-16 12 views
0

私はdocker-compose.ymlファイルから作成したボリュームを持っています。ボリュームmy_volumeとそれがmy_containerに関連付けられているコンテナを呼び出してみましょう。私は、ボリュームの内容の削除をスクリプト化したい。以下のすべては、my_containerが停止しているが、削除されていないことを前提としています。ドッカーボリュームの内容をどのように削除しますか?

私が使用して、ボリュームの内容を一覧表示することができます

docker run --rm -v my_volume:/data/ ubuntu ls -la /data 

これは動作しますので、次の私が使用してデータフォルダの内容を削除しよう:エラー・メッセージが報告されていない

docker run --rm -v my_volume:/data/ ubuntu rm -rf /data/* 

そうすれば正常に表示されますが、ボリュームの内容を再度一覧表示すると、ボリューム内のデータはすべて削除されません。

私はそうのような除去をやって、コンテナを入力して削除を実行できます。

コンテナ内から、その後
docker run --rm -it -v my_volume:/data/ ubuntu /bin/bash 

rm -rf /data/* 

これは正常に動作し、内容が削除され、これはスクリプティングが不可能なので目的を破る。私がコンテナの外でそれを使用しようとしたときにrmが動作しない理由と、ボリュームの内容を正常に削除する方法はありますか?ボリュームを削除して新しいボリュームを作成したくないということに注意してください。そうしないと、ボリュームに関連付けられた元のコンテナ/イメージを削除する必要があります。助けてくれてありがとう!

+0

はたぶん、本当にどこを探しているではないが、あなたは、私が試した' RM -rの/ var/libに/ドッキングウィンドウ/ボリューム/ my_volume/_data/* ' – lvthillo

+0

他のものを使用して、ボリュームをクリアすることができます - docker run --rm -v my-volume:/ data/ubuntu rm -rf data/'働いていましたが、デバイスが警告/エラーをビジー状態にしました。別の「解決策」は、すべてを別々に削除していました(ただし、あなたのボリュームに何が含まれているかを常に知っているときにのみこれを行うことができます: 'docker run --rm -v my-volume:/ data/ubuntu rm -rf data/dir1 data/dir2 data/file1 ..' – lvthillo

答えて

2

私は、コンテナの外にそれを使用しようとすると、RMが動作しない理由を任意のアイデアは

私は何が起こっていること/data/*がホストシェルで評価されていることであると信じています。そのため、コンテナは実際にはrm -rf /data/somefile /data/otherfile ...というコマンドで、ホスト上の/dataディレクトリにあるファイルのリストとともに実行されています。これらのファイルがコンテナと一致しない場合は、何も削除されていないように見えます。

単一引用符を使用すると、ホストシェルでの展開を防ぐことができます。 `

rm -rf '/data/*' 
+1

Dockerは引用符をコンテナに渡しているようです。そうでなければ、シェルを展開せずに実行しているので、 '/ data/*'が見つかりません。あなたのための拡張: 'docker run --rm -v my_volume:/ data/ubuntu/bin/sh -c" rm -rf/data/* "' – BMitch

+0

BMitchに感謝します。 – Brett

関連する問題