GAミント至上主義

Web Monomaniacal Developer.

Dockerのイメージから過去のソースコード等を救出する

DockerとGKE(Google Container Engine)を開発に使うようになってから、gitだけでなく、Dockerのイメージもバージョンで保存されるようになった。

ソースコードを変更後、動作確認のためにDockerイメージをビルドし直すことが多いので、頻度としては、gitへのコミットよりも、Dockerのビルドの方が多い。

そのため、gitにコミットする前に、ファイルを消してしまった、変更してしまった場合、Dockerのイメージからファイルを救出することができる。

私の普段の開発の流れは下記のよう。
まだ自動テスト、自動デプロイが必要な規模にはなってないので、最後2つの順番は変わったりする。

  1. ソースコードの追加、修正
  2. Dockerイメージのビルド
  3. 開発環境でテスト
  4. gitコミット
  5. 本番環境へアップ


そして、月曜午前中に出社して、寝ぼけてコミット前なのに「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

エンジニアのためのGITの教科書 (WEB Engineer’s Books)

エンジニアのためのGITの教科書 (WEB Engineer’s Books)