docker commit してもファイルが保存されない
タイトルの通り、docker commit
でファイルがイメージに保存されず、結構長い間苦しめられたので記事に・・・
コマンドについて説明すると、docker 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