先ほど、MongoDBのデータを、DockerからPodmanへ移行したのですが。
どうもダンプしたデータが古く、最新ではなかったようです。
最新のデータはダンプではなく、コンテナの/data/dbに入っていたようです。
ふむ。
古いdockerコンテナのディレクトリ構造を取り出して、Podmanに持ってゆくためのコマンドを記録しておこうと思いますが・・・・。
目次
Podmanで名前付きボリュームを扱うコマンド覚書
やりたいことですが。
昔、Dockerでマウントしていた/data/dbディレクトリがあります。
そちらを、Podmanのコンテナに読み込ませたい。ということになります。
dockerでローカルボリュームをマウントしていたため、このような感じでWindowsのフォルダにdbディレクトリの内容が残っています。
この内容を、PodmanのMongoDBコンテナの/data/dbディレクトリに格納してから、コンテナを起動したい、ということになります。
まずは、名前付きボリュームを作成して、そこに入れてみようと思います。
名前付きボリュームの作成
まずは、データを予め入れておくためのボリュームを作成しようと思います。
ボリューム名は、sv1-mongodb-vol
マウントするディレクトリは、/data/dbです。
podman run --rm -v sv1-mongodb-vol:/data/db fedora ls -al /data/db
podman volume ls
空のディレクトリが表示されると思います。そして名前付きボリュームが作成されます。
ここにDockerで作ったコンテナのデータを入れますが、正しく動作するように、予めPodmanでMongoDBを動かした時のファイル構成を記録しておきます。
PodmanでMongoDBを動かすと、既定では上図のファイル構成になります。
いちばん見たかったところは、オーナー情報です。ユーザ999、グループ999となっており、それ以外のユーザに閲覧権限が無い設定になっています。
dockerのフォルダー構成をコピーした後、同じオーナー情報を設定する必要があります。
名前付きボリュームにファイルをコピー
名前付きボリュームの該当のディレクトリへ、データをコピーしようと思います。
先ほどと同様、実行後に自動的に消えるコンテナを作成し、ファイルをコピーします。
マウントするボリュームは2つ。
- コピー先として、名前付きボリュームをマウント
- コピー元として、カレントディレクトリを/backupにマウント
そしてcp -rコマンドでファイルをコピーしようと思います。
rem /data/dbディレクトリの内容削除
podman run --rm -v sv1-mongodb-vol:/data/db fedora rm -fr /data/db/*
rem dbディレクトリの内容をコピー
podman run --rm ^
-v sv1-mongodb-vol:/data/db ^
-v ./:/backup
fedora cp -r /backup/db /data
rem 内容確認
podman run --rm -v sv1-mongodb-vol:/data/db fedora ls -al /data/db
このような感じで、名前付きボリュームの該当のディレクトリに、データをコピーすることができました。
しかし、Windowsのフォルダからコピーした影響で、当初の予想通り、オーナーとモードが変わってしまっています。オーナーがroot.rootになっています。
このあたりを調整する必要がありそうです。
ボリューム内のファイルのオーナーとモードの調整
予め確認しておいた内容で、オーナーとモードを変更しておこうと思います。
chownコマンドと、chmodコマンドを使用します。
rem オーナー変更
podman run --rm -v sv1-mongodb-vol:/data/db fedora chown -R 999.999 /data/db
rem モード変更
podman run --rm -v sv1-mongodb-vol:/data/db fedora chmod -R go-rwx /data/db
rem 内容確認
podman run --rm -v sv1-mongodb-vol:/data/db fedora ls -al /data/db
まあコンテナの内容はコピーされていますので、今のところ良しとします。
名前付きボリュームを使用してコンテナを起動
作成した名前付きボリュームを使用して、ポッドとコンテナを起動します。
rem ポッド作成
podman pod create --name sv1-pod -p=8080:8080/tcp,8081:8081/tcp
rem 名前付きボリュームをマウントしてMongoDBコンテナ作成
podman run ^
--restart=always ^
--pod=sv1-pod ^
--name=sv1-mongodb ^
-e MONGO_INITDB_ROOT_USERNAME="root" ^
-e MONGO_INITDB_ROOT_PASSWORD="humongous" ^
-v sv1-mongodb-vol:/data/db ^
-v .:/backup ^
-d docker.io/library/mongo:latest
rem Mongo Expressコンテナ作成
podman run ^
--restart=always ^
--pod=sv1-pod ^
--name=sv1-mongoexp ^
-e ME_CONFIG_MONGODB_SERVER="127.0.0.1" ^
-e ME_CONFIG_MONGODB_ADMINUSERNAME="root" ^
-e ME_CONFIG_MONGODB_ADMINPASSWORD="humongous" ^
-v .:/backup ^
-d docker.io/library/mongo-express:latest
MongoDBコンテナの/data/dbディレクトリは、先ほど作成したsv1-mongodb-volをマウントしました。
さて。
起動後、ログを見てみましょう。
rem sv1-mongodbコンテナのログを表示
podman logs -f sv1-mongodb
/data/dbディレクトリは、昔Dockerで使用した構成になっていますが。
どうも正常に動作していません。
3年ほど寝かせておいたため、MongoDBイメージのバージョンが進んで、古いバージョンのディレクトリ構成では正常に起動しないようです。
まあ当たり前ですが、古いディレクトリ構成は、古いバージョンのイメージを起動する必要がある感じです。
古いバージョンのdockerイメージが存在するかどうか確認
古いDockerイメージのバックアップを動かしたいということで。
docker.io/library/mongoのタグ情報を調べてみました。
rem MongoDBのタグ一覧表示
podman search --list-tags docker.io/library/mongo
2022年11月12日現在。
イメージ バージョン2.2から、2.7までのタグが存在するようです。
もしも、古いイメージのディレクトリ構成でコンテナを動かしたい場合。
公開されているイメージのタグの中から、該当するバージョンのタグを指定して、コンテナを起動する必要があるかと思います。
私の場合、3年くらい前のコンテナということは認識できますが。
具体的に、どのバージョンのイメージを使っていたかの記録が無いため。
古いバージョンのタグを指定してコンテナを起動して、確認する必要がありそうです。
うーん。寝かせすぎてお手上げでした。🤷
名前付きボリュームを作成して、Podmanのコンテナでマウントして、データのコピーやオーナー・モードの変更を行ってみました。
この記事は、昔Dockerで使っていたデータを入れたため、少し目的が異なってしまいましたが。
名前付きボリュームを使用する目的は、コンテナ間でデータのやり取りを行う事かと思います。
コンテナ作成時、-vオプションで、名前付きボリュームとマウントポイントを指定することで、確かにコンテナ間でデータのやり取りが可能であることがわかりました。
移行元と移行先で、同じバージョンのコンテナを使用しないと意味がないなあ・・・寝かせ過ぎはダメだと反省致しました。(汗