🦔

docker commit してもファイルが保存されない

2022/10/22に公開

タイトルの通り、docker commit でファイルがイメージに保存されず、結構長い間苦しめられたので記事に・・・

コマンドについて説明すると、docker commit コマンドは、コンテナの中のファイルを維持した状態で、イメージに保存するコマンドです。リンク先のドキュメントも見てみてください。

https://docs.docker.com/engine/reference/commandline/commit/

この docker commit を使って、コンテナ内にファイルがある状態で、イメージに保存しようとしたのですが、イメージからコンテナを起動すると、docker commit 時に存在していたはずのファイルが消えてしまうのです。

原因は単純でした

ボリュームマウントされたデータは、docker commit 操作には含まれない

コンテナに対して、docker-compose.yml の volumes を使って、ホストに存在するディレクトリをコンテナにボリュームマウントした上で、docker commit し、イメージ内にファイルを保存しようと頑張っていました。
しかし、ドキュメントをちゃんと見ると

The commit operation will not include any data contained in volumes mounted inside the container.

と書かれていました・・・・

なので、ボリュームマウントしたデータをイメージに保存しようと一生懸命 docker commit しても意味ないよという話でした。

ちなみに、ボリュームマウントが設定されているかどうかは inspect コマンドとかで確認できます。

コマンドライン
docker image inspect mysql:5.7.38-debian | jq ".[0] | .ContainerConfig.Volumes"
{
  "/var/lib/mysql": {}
}

コマンドライン
docker image inspect mysql:5.7.38-debian | jq ".[0] | .Config.Volumes"
{
  "/var/lib/mysql": {}
}

のようにです。
上記は image に対しての inspection ですが container に対しても同じような内容が確認できたはずです。

上記の参照の結果が表しているのは、/var/lib/mysql のディレクリはボリュームになっているので、この場所にファイルを保存して、docker commit しても、その結果生成される image には反映されないということです。

docker commit について以上です。

Discussion