コンテンツにスキップ

Djangoコンテナのデータ移行

Dockerをホストしているサーバを移行するため、Djangoアプリケーションのコンテナを別のサーバへ移行しました。 とは言っても、コンテナイメージはDocker Hubにアップロードされているため、DBデータの移行がメインです。

Djangoには、DBデータのダンプ作成/ロード機能が標準で用意されている1ため、それを利用します。 ダンプ作成時にフォーマットを指定できるのですが、デフォルトのJSONでエクスポートした場合、 タイムスタンプ型のデータが小数点以下3桁で切り捨てられていたため、今回はフォーマットオプションにXMLを指定しています。

データバックアップ

ダンプデータを取得します。

ダンプデータ取得コマンド

docker-compose exec webapp \
    sh -lc "python manage.py dumpdata --format xml 2> /dev/null" > data.xml
bzip2 data.xml

ダンプデータ取得コマンド

container_name="$(kubectl get pod -l app=dhun-app,tier=frontend -o custom-columns=NAME:.metadata.name --no-headers) --container dhun-webapp"
kubectl exec $container_name -- sh -lc "python manage.py dumpdata --format=xml 2> /dev/null" > data.xml
bzip2 data.xml

この後、新しいサーバへdata.xml.bz2を転送します。

データリストア

前項で取得したダンプデータを、DBへロードします。
データロード前にDBマイグレーションとクリアを実行しています。

ダンプデータロードコマンド

docker-compose run --rm -v $(pwd)/data.xml.bz2:/tmp/data.xml.bz2:ro webapp \
    sh -lc "python manage.py migrate && \
        python manage.py flush && \
        python manage.py loaddata --exclude contenttypes /tmp/data.xml.bz2"

この後、docker-compose up -d でアプリを立ち上げて、データが読み込めていたら完了です。

ダンプデータロードコマンド

container_name="$(kubectl get pod -l app=dhun-app,tier=frontend -o custom-columns=NAME:.metadata.name --no-headers | head -n 1) --container dhun-webapp"
bzcat data.xml.bz2 | kubectl exec -i $container_name -- sh -lc "python manage.py loaddata --format=xml -"

この後、データが読み込めていたら完了です。