Red Hat Training

A Red Hat training course is available for OpenShift Container Platform

第30章 ファイルのコンテナーから/へのコピー

30.1. 概要

CLI を使用してコンテナーのリモートディレクトリーに/からローカルファイルをコピーできます。これは、バックアップと復元を実行するためにデータベースアーカイブを Pod にコピーし、Pod からコピーするのに役立つツールです。また、実行中の Pod がソースファイルのホットリロードをサポートする場合に、ソースコードの変更を開発のデバッグ目的で実行中の Pod にコピーするために使用できます。

30.2. 基本的な使用方法

ローカルファイルをコンテナーから/へコピーするためのサポートは、CLI に組み込まれています。

$ oc rsync <source> <destination> [-c <container>]

たとえば、ローカルディレクトリーを Pod ディレクトリーにコピーするには、以下を実行します。

$ oc rsync /home/user/source devpod1234:/src

または、Pod ディレクトリーをローカルディレクトリーにコピーするには、以下を実行します。

$ oc rsync devpod1234:/src /home/user/source

30.3. データベースのバックアップおよび復元

oc rsync を使用して、データベースアーカイブを既存のデータベースコンテナーから新規データベースコンテナーの永続ボリュームディレクトリーにコピーします。

注記

MySQL は以下の例で使用されています。mysql|MYSQLpgsql|PGSQL または mongodb|MONGODB に置き換え、移行ガイド を参照してサポートされているデータベースイメージに対応するコマンドを確認してください。この例では既存のデータベースコンテナーを使用していることを前提としています。

  1. 実行中のデータベース Pod から既存のデータベースをバックアップします。

    $ oc rsh <existing db container>
    # mkdir /var/lib/mysql/data/db_archive_dir
    # mysqldump --skip-lock-tables -h ${MYSQL_SERVICE_HOST} -P ${MYSQL_SERVICE_PORT:-3306} \
      -u ${MYSQL_USER} --password="$MYSQL_PASSWORD" --all-databases > /var/lib/mysql/data/db_archive_dir/all.sql
    # exit
  2. ローカルマシンに対してアーカイブファイルのリモート同期を実行します。

    $ oc rsync <existing db container with db archive>:/var/lib/mysql/data/db_archive_dir /tmp/.
  3. 上記で作成されたデータベースアーカイブを読み込む 2 つ目の MySQL Pod を起動します。MySQL Pod には固有の DATABASE_SERVICE_NAME がなければなりません。

    $ oc new-app mysql-persistent \
      -p MYSQL_USER=<archived mysql username> \
      -p MYSQL_PASSWORD=<archived mysql password> \
      -p MYSQL_DATABASE=<archived database name> \
      -p DATABASE_SERVICE_NAME='mysql2' 1
    $ oc rsync /tmp/db_archive_dir new_dbpod1234:/var/lib/mysql/data
    $ oc rsh new_dbpod1234
    1
    mysql はデフォルトです。この例では mysql2 が作成されます。
  4. 適切なコマンドを使用してコピーされたデータベースアーカイブディレクトリーから新規のデータベースコンテナーにデータベースを復元します。

    MySQL

    $ cd /var/lib/mysql/data/db_archive_dir
    $ mysql -u root
    $ source all.sql
    $ GRANT ALL PRIVILEGES ON <dbname>.* TO '<your username>'@'localhost'; FLUSH PRIVILEGES;
    $ cd ../; rm -rf /var/lib/mysql/data/db_backup_dir

    これで、アーカイブされたデータベースを使って 2 つの MySQL データベース Pod がプロジェクトで実行されていることになります。

30.4. 要件

oc rsync コマンドは、クライアントのマシンでローカルの rsync コマンドを使用します。この場合、リモートコンテナーにも rsync コマンドがあることが必要になります。

rsync がローカルまたはリモートコンテナーにない場合、tar アーカイブがローカルに作成され、tar がファイルを展開するために使用されるコンテナーに送信されます。tar がリモートコンテナーで利用できない場合にコピーは失敗します。

tar のコピー方法は rsync と同様に機能する訳ではありません。たとえば、rsync は宛先ディレクトリーを作成し (存在しない場合)、ソースと宛先間の差分のファイルのみを送信します。

注記

Windows では、cwRsync クライアントが oc rsync コマンドで使用するためにインストールされ、PATH に追加される必要があります。

30.5. Copy Source の指定

oc rsync コマンドのソース引数はローカルディレクトリーまた Pod ディレクトリーのいずれかを参照する必要があります。個々のファイルは現時点ではサポートされていません。

Pod ディレクトリーを指定する場合、ディレクトリー名の前に Pod 名を付ける必要があります。

<pod name>:<dir>

標準の rsync の場合と同様に、ディレクトリー名がパスセパレーター (/) で終了する場合、ディレクトリーの内容のみが宛先にコピーされます。そうでない場合は、ディレクトリー自体がその内容すべてと共に宛先にコピーされます。

30.6. Copy Destination の指定

oc rsync コマンドの宛先引数はディレクトリーを参照する必要があります。ディレクトリーが存在せず、rsync がコピーに使用される場合、ディレクトリーが作成されます。

30.7. 宛先でのファイルの削除

--delete フラグは、ローカルディレクトリーにないリモートディレクトリーにあるファイルを削除するために使用できます。

30.8. ファイル変更についての継続的な同期

--watch オプションを使用すると、コマンドはソースパスでファイルシステムの変更をモニターし、変更が生じるとそれらを同期します。この引数を指定すると、コマンドは無期限に実行されます。

同期は短い非表示期間の後に実行され、急速に変化するファイルシステムによって同期呼び出しが継続的に実行されないようにします。

--watch オプションを使用する場合、動作は通常 oc rsync に渡される引数の使用を含め oc rsync を繰り返し手動で起動する場合と同様になります。そのため、--delete などの oc rsync の手動の呼び出しで使用される同じフラグでこの動作を制御できます。

30.9. 高度な Rsync 機能

oc rsync コマンドは標準の rsync ほどコマンドラインのオプションを表示しません。oc rsync で利用できない標準の rsync コマンドラインオプションを使用する場合 (--exclude-from=FILE オプションなど)、以下のように標準の rsync--rsh (-e) オプションまたは RSYNC_RSH 環境変数を回避策として使用することができます。

$ rsync --rsh='oc rsh' --exclude-from=FILE SRC POD:DEST

または、以下を実行します。

$ export RSYNC_RSH='oc rsh'
$ rsync --exclude-from=FILE SRC POD:DEST

上記の例のいずれも標準の rsync をリモートシェルプログラムとして oc rsh を使用するように設定して リモート Pod に接続できるようにします。これらは oc rsync を実行する代替方法となります。