DockerとGKE(Google Container Engine)を開発に使うようになってから、gitだけでなく、Dockerのイメージもバージョンで保存されるようになった。
ソースコードを変更後、動作確認のためにDockerイメージをビルドし直すことが多いので、頻度としては、gitへのコミットよりも、Dockerのビルドの方が多い。
そのため、gitにコミットする前に、ファイルを消してしまった、変更してしまった場合、Dockerのイメージからファイルを救出することができる。
私の普段の開発の流れは下記のよう。
まだ自動テスト、自動デプロイが必要な規模にはなってないので、最後2つの順番は変わったりする。
- ソースコードの追加、修正
- Dockerイメージのビルド
- 開発環境でテスト
- gitコミット
- 本番環境へアップ
そして、月曜午前中に出社して、寝ぼけてコミット前なのに「git resetしちゃった!」というとき。
落ち着いて下記のようなコマンドを叩く。
grepでなくてもdocker imagesコマンドのfilterなどを使ってもいい
% sudo docker images | grep arms asia.gcr.io/oceanus-dev/arms latest 0f8530abb371 5 weeks ago 278.5 MB asia.gcr.io/oceanus-dev/arms v20161207-01 0f8530abb371 5 weeks ago 278.5 MB asia.gcr.io/oceanus-dev/arms v20161124-01 f302e57a0ebb 7 weeks ago 278.5 MB asia.gcr.io/oceanus-dev/arms v20161115-02 7f2fe84bb244 8 weeks ago 278.5 MB asia.gcr.io/oceanus-dev/arms v20161115-01 be7d629f9186 8 weeks ago 278.5 MB asia.gcr.io/oceanus-dev/arms v20161111-02 75ce674e8eed 9 weeks ago 278.5 MB asia.gcr.io/oceanus-dev/arms v20161111-01 4bbecf26285f 9 weeks ago 278.6 MB asia.gcr.io/oceanus-dev/arms v20161107-alpine03 b21bdc36165b 9 weeks ago 278.6 MB asia.gcr.io/oceanus-dev/arms v20161107-alpine01 6a890b567b5a 10 weeks ago 278.6 MB asia.gcr.io/oceanus-dev/arms v20161107-alpine02 6a890b567b5a 10 weeks ago 278.6 MB
GKEを使っているため、こんな感じで日付+連番でタグを付けてイメージを作っています。
そもそも全部同じ名前でビルドしてたら上書きされるので今回の手段はあまり使えません。
消してしまったファイルがありそうな日付のイメージをdocker runで、-dを付けて起動する
%sudo docker run -d asia.gcr.io/oceanus-dev/arms:v20161115-02 4d32169a35ade3104169886bbc6e14218a688f84c43c854b8ec4a40e6f578a75
起動したイメージにexecでshで入る
%sudo docker exec -it 4d32169a35ade31041 sh
中に入って目的のファイルが無事か確認する。
無事だったらフルパスをコピーしておく。
無事じゃなかったら他のイメージを探すかご愁傷様。
シェルから出て、ホスト側でdocker cpコマンドでコピーすればおk。
https://docs.docker.com/engine/reference/commandline/cp/docs.docker.com
Docker実践入門――Linuxコンテナ技術の基礎から応用まで (Software Design plus)
- 作者: 中井悦司
- 出版社/メーカー: 技術評論社
- 発売日: 2015/09/26
- メディア: 大型本
- この商品を含むブログ (2件) を見る