Podmanの名前付きボリュームでコンテナ間でデータをやり取りするには

先ほど、MongoDBのデータを、DockerからPodmanへ移行したのですが。

DockerからPodman.exeへのコンテナ移行手順 MongoDB編
前回、Dockerで動かしていましたPostgreSQLコンテナのデータベースを。 Windows版Podman.exeで新たにポッド...

どうもダンプしたデータが古く、最新ではなかったようです。

最新のデータはダンプではなく、コンテナの/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つ。

  1. コピー先として、名前付きボリュームをマウント
  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

ファイルにxが設定されてしまってますが。

まあコンテナの内容はコピーされていますので、今のところ良しとします。


名前付きボリュームを使用してコンテナを起動

作成した名前付きボリュームを使用して、ポッドとコンテナを起動します。

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

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オプションで、名前付きボリュームとマウントポイントを指定することで、確かにコンテナ間でデータのやり取りが可能であることがわかりました。

移行元と移行先で、同じバージョンのコンテナを使用しないと意味がないなあ・・・寝かせ過ぎはダメだと反省致しました。(汗

スポンサーリンク

フォローする

スポンサーリンク