ここで起こっているいくつかのこと:
まず、docker commit
コードの臭いです。これは、簡単に再作成できるDockerfileを使用してビルドを自動化するのではなく、手動プロセスでイメージを作成する場合に使用される傾向があります。可能であれば、イメージを作成するためにDockerfileに移行することをお勧めします。
次に、docker commit
ボリュームに加えられた変更はキャプチャされません。 また、RUN
でボリュームを更新しようとすると、これと同じ問題が発生します。 Dockerfileにステップインします。これらは両方とも、コンテナーファイルシステムへの変更をキャプチャし、それらの変更をDockerイメージのレイヤーとして保存します。ボリュームは、コンテナーファイルシステムの一部ではありません。これは、docker diff
を実行した場合にも表示されます コンテナに対して。この場合、アップストリームイメージはDockerfileでボリュームを定義しています:
VOLUME /var/lib/mysql
また、dockerには、Dockerfileから作成されたボリュームを元に戻すコマンドがありません。 Dockerの外部からイメージ定義を直接変更するか(非推奨)、そのステップを削除して独自のアップストリームイメージを構築する必要があります(推奨)。
mysqlイメージが提供するのは、/docker-entrypoint-initdb.d
に独自のデータベース作成スクリプトを挿入する機能です。 、mysqlを拡張する独自のイメージで追加したり、ボリュームとしてマウントしたりできます。ここで、スキーマを挿入するか、開発用の既知のバックアップから初期化します。
最後に、永続性を確保することが目標である場合は、コンテナをコミットするのではなく、データをボリュームに保存する必要があります。
docker run -v mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql
ボリュームを使用すると、データを失うことなく、コンテナを再作成し、パッチがリリースされたときにmysqlの新しいバージョンにアップグレードできます(セキュリティ修正など)。
ボリュームをバックアップするには、これをtgzにエクスポートします:
docker run --rm -v mysql-data:/source busybox tar -cC /source . >backup.tgz
そして、ボリュームを復元するために、これはtgzからボリュームを作成します:
docker run --rm -i -v mysql-data:/target busybox tar -xC /target <backup.tgz